51单片机(汇编语言)实现十进制转十六进制

任务描述

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

汇编鲨我~~~~

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页