任务描述
DEC0 DEC1 DEC2 存放"十进制"数 eg:03 35 96
HEX0 HEX1存放十六进制数 eg:83 3C
任务原理
本质是BCD码转二进制
所谓的十进制 如“15”,对应的是 0x15H 这一个十六进制数,而0x15的十进制数为21,二进制为0001 0101(就是1 “和” 5)
所以,我们要做的是 把每一位十进制的BCD码提出来,附上相应的权重,结果本质为普通的二进制,表现为十六进制(这听起来很绕口)但是在keil里跑一下会更好理解(后面会结合代码分析)
方案Ⅰ
思路
循环—> (HEX*10)+TMP
1.从高位开始 提取“十进制”的每一位数(半个byte存一位)
2.带进位的循环
(进位:HEX1溢出的存进HEX0)
(循环:结果存回HEX1 HEX0中)
代码
40H 41H 42H 为DEC0 DEC1 DEC2
R1 R2 为 HEX0 HEX1
ORG 0000H
LJMP MAIN
ORG 0100H
LOOP: MOV A,R2
MOV B,#0AH ;DEC = 10
MUL AB
MOV R5,B ;JW
MOV R2,A
MOV A,R1
MOV B,#0AH ;DEC = 10
MUL AB
ADD A,R5 ;+JW
MOV R1,A ;R1R2*10
;2BYTE + 1BYTE: R1R2 + R6
MOV A,R6
ADDC A,R2
MOV R2,A
MOV A,#00H
ADDC A,R1
MOV R1,A
RET
MAIN: MOV 40H,#03H
MOV 41H,#35H
MOV 42H,#96H ;input
MOV R1,#00H
MOV R2,#00H ;output
MOV R4,#6
MOV R5,#00H ;tmp--JW
MOV R6,#00H ;HALF BYTE TAKEN FROM SRC
MOV B,#0AH ;DEC = 10
MOV A,40H
ANL A,#0FH
MOV R6,A ;R6 = 05H
LCALL LOOP
MOV A,41H
SWAP A
ANL A,#0FH
MOV R6,A ;R6 = 04H
LCALL LOOP
MOV A,41H
ANL A,#0FH
MOV R6,A ;R6 = 03H
LCALL LOOP
MOV A,42H
SWAP A
ANL A,#0FH
MOV R6,A ;R6 = 01H
LCALL LOOP
MOV A,42H
ANL A,#0FH
MOV R6,A ;R6 = 05H
LCALL LOOP
END
运行结果
算法补充
循环四位移位
实现输入EA1F 依次变换成 A1FE->1FEA->FEA1,R6存储最高的半子节
(但是感觉这个写法也有点长,所以还是直接用了swap,anl依次取)
L1:
MOV A,40H
SWAP A
ANL A,#0FH
MOV R6,A
MOV A,41H
SWAP A
ANL A,#0FH
MOV @R1,A
;XCHD A,@R1 ;@R1--01H
;MOV A,@R1 ;TO WATCH R1
MOV A,40H
SWAP A
XCHD A,@R1
MOV 40H,A
MOV R3,40H ;TO WATCH
MOV A,41H
SWAP A
XCHD A,@R1
MOV 41H,A
MOV R5,41H ;TO WATCH
;MOV A,@R1 ;R1--0EH
DJNZ R4,L1
带进位的乘法
带进位的乘法
eg:150H*AH = D20H,进位存在R5中
MOV R1,#01H
MOV R2,#50H ;output
MOV R5,#00H ;tmp--JW
MOV A,R2
MOV B,#0AH ;DEC = 10
MUL AB
MOV R5,B ;JW
MOV R2,A
MOV A,R1
MOV B,#0AH ;DEC = 10
MUL AB
ADD A,R5 ;+JW
MOV R1,A
2bytes + 1byte
两字节+一字节
eg:3FFH + EH = 40DH
MOV R1,#03H
MOV R2,#0FFH ;output
MOV R6,#0EH ;HALF BYTE TAKEN FROM SRC
MOV A,R6
ADDC A,R2
MOV R2,A
MOV A,#00H
ADDC A,R1
MOV R1,A
方案Ⅱ
(日后分析,先上代码)
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV 20H,#06H
MOV 21H,#02H
MOV 22H,#55H ;input 60255
MOV R1,#00H ;HEX0
MOV R2,#00H ;HEX1
MOV R3,#10H ;10000 = 2710H
MOV R4,#27H
MOV A,20H
ANL A,#0FH ;A = 06
//SWAP A
JZ BRAN1
LOOP1: DEC A
LCALL ADDT
JNZ LOOP1
BRAN1: MOV R3,#0E8H
MOV R4,#03H ;1000 = 03E8H
MOV A,21H
ANL A,#0F0H ;THOUSAND
SWAP A
JZ BRAN2
LOOP2: DEC A
LCALL ADDT
JNZ LOOP2
BRAN2: MOV R3,#64H
MOV R4,#00H
MOV A,21H
ANL A,#0FH ;HUNDRED
JZ BRAN3
LOOP3: DEC A
LCALL ADDT
JNZ LOOP3
BRAN3: MOV R3,#0AH
MOV R4,#00H
MOV A,22H
ANL A,#0F0H ;TEN
SWAP A
JZ BRAN4
LOOP4: DEC A
LCALL ADDT
JNZ LOOP4
BRAN4: MOV A,22H
ANL A,#0FH ;GE
MOV R3,A
LCALL ADDT
RET
ADDT: PUSH PSW
PUSH ACC
CLR C
MOV A,R2
ADD A,R3
MOV R2,A
MOV A,R1
ADDC A,R4
MOV R1,A
POP ACC
POP PSW
RET
汇编鲨我~~~~