用移位减法做4位16进制数除以4位16进制数运算
时间:04-03
来源:互联网
点击:
;只能整数运算及非0运算
ORG 0000H
JMP A1
ORG 002BH
A1: MOV R0,#0FFH;被除数
MOV R1,#0FFH;被除数
MOV R2,#0;余数
MOV R3,#0;余数
MOV R4,#0;商
MOV R5,#0;商
MOV R6,#03H;除数
MOV R7,#0E8H;除数
MOV 30H,#16
A2: MOV A,R1;先把移低字节移到高字节位
RLC A;
MOV R1,A;
MOV A,R0;先处理高字节和接收低字节传上来的位字节
RLC A;
MOV R0,A;
MOV A,R3;把移出来的数处理
RLC A;
MOV R3,A;
MOV A,R2;把移出来的数处理
RLC A;
MOV R2,A;
A4:
MOV A,R3;先减低字节8位
CLR C;清C
SUBB A,R7;A=A-C-R7
MOV 32H,A;临时保存余数
MOV A,R2;再减高8位
SUBB A,R6;不能清C低八位可能有借位
JC A3;判断大小大则保存余数到R2,R3
MOV R3,32H;保存低八位余数
MOV R2,A;保存高八位余数
;由于除数为4位16进制数所以余数有可能超过2位16进制数要用2个寄存器
A3: CPL C;商处理
MOV A,R5;先把存到低字节位
RLC A;
MOV R5,A;
MOV A,R4;通过低字节存到高字节
RLC A;
MOV R4,A;
DJNZ 30H,A2;判断是否完成
JMP $
END
;思路--除数为4位16进制数就得要用2个寄存器
;
; R2 R3 R6 R7 R4 R5
;1、 00000000>00000001-00000011>11101000小于0,商值为00000000>00000000B
;2、 00000000>00000011-00000011>11101000小于0,商值为00000000>00000000B
;3、 00000000>00000111-00000011>11101000小于0,商值为00000000>00000000B
;4、 00000000>00001111-00000011>11101000小于0,商值为00000000>00000000B
;5、 00000000>00011111-00000011>11101000小于0,商值为00000000>00000000B
;6、 00000000>00111111-00000011>11101000小于0,商值为00000000>00000000B
;7、 00000000>01111111-00000011>11101000小于0,商值为00000000>00000000B
;8、 00000000>11111111-00000011>11101000小于0,商值为00000000>00000000B
;9、 00000001>11111111-00000011>11101000小于0,商值为00000000>00000000B
;10、00000011>11111111-00000011>11101000大于0,商值为00000000>00000001B;余数00010111B赋值给R3,00000000B赋值给R2
;11、00000000>00101111-00000011>11101000小于0,商值为00000000>00000010B
;12、00000000>01011111-00000011>11101000小于0,商值为00000000>00000100B
;13、00000000>10111111-00000011>11101000小于0,商值为00000000>00001000B
;14、00000001>01111111-00000011>11101000小于0,商值为00000000>00010000B
;15、00000010>11111111-00000011>11101000小于0,商值为00000000>00100000B
;16、00000100>11111111-00000011>11101000大于0,商值为00000000>01000001B,余数00010111B赋值给R3,00000010B赋值给R2
;至此算法完成
ORG 0000H
JMP A1
ORG 002BH
A1: MOV R0,#0FFH;被除数
MOV R1,#0FFH;被除数
MOV R2,#0;余数
MOV R3,#0;余数
MOV R4,#0;商
MOV R5,#0;商
MOV R6,#03H;除数
MOV R7,#0E8H;除数
MOV 30H,#16
A2: MOV A,R1;先把移低字节移到高字节位
RLC A;
MOV R1,A;
MOV A,R0;先处理高字节和接收低字节传上来的位字节
RLC A;
MOV R0,A;
MOV A,R3;把移出来的数处理
RLC A;
MOV R3,A;
MOV A,R2;把移出来的数处理
RLC A;
MOV R2,A;
A4:
MOV A,R3;先减低字节8位
CLR C;清C
SUBB A,R7;A=A-C-R7
MOV 32H,A;临时保存余数
MOV A,R2;再减高8位
SUBB A,R6;不能清C低八位可能有借位
JC A3;判断大小大则保存余数到R2,R3
MOV R3,32H;保存低八位余数
MOV R2,A;保存高八位余数
;由于除数为4位16进制数所以余数有可能超过2位16进制数要用2个寄存器
A3: CPL C;商处理
MOV A,R5;先把存到低字节位
RLC A;
MOV R5,A;
MOV A,R4;通过低字节存到高字节
RLC A;
MOV R4,A;
DJNZ 30H,A2;判断是否完成
JMP $
END
;思路--除数为4位16进制数就得要用2个寄存器
;
; R2 R3 R6 R7 R4 R5
;1、 00000000>00000001-00000011>11101000小于0,商值为00000000>00000000B
;2、 00000000>00000011-00000011>11101000小于0,商值为00000000>00000000B
;3、 00000000>00000111-00000011>11101000小于0,商值为00000000>00000000B
;4、 00000000>00001111-00000011>11101000小于0,商值为00000000>00000000B
;5、 00000000>00011111-00000011>11101000小于0,商值为00000000>00000000B
;6、 00000000>00111111-00000011>11101000小于0,商值为00000000>00000000B
;7、 00000000>01111111-00000011>11101000小于0,商值为00000000>00000000B
;8、 00000000>11111111-00000011>11101000小于0,商值为00000000>00000000B
;9、 00000001>11111111-00000011>11101000小于0,商值为00000000>00000000B
;10、00000011>11111111-00000011>11101000大于0,商值为00000000>00000001B;余数00010111B赋值给R3,00000000B赋值给R2
;11、00000000>00101111-00000011>11101000小于0,商值为00000000>00000010B
;12、00000000>01011111-00000011>11101000小于0,商值为00000000>00000100B
;13、00000000>10111111-00000011>11101000小于0,商值为00000000>00001000B
;14、00000001>01111111-00000011>11101000小于0,商值为00000000>00010000B
;15、00000010>11111111-00000011>11101000小于0,商值为00000000>00100000B
;16、00000100>11111111-00000011>11101000大于0,商值为00000000>01000001B,余数00010111B赋值给R3,00000010B赋值给R2
;至此算法完成
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)