没想到什么好思路诶,给个笨办法参考:
- ; 功能:将16位十六进制数转换为十进制,结果存于5字节缓冲区
- ; 入口:待转换数存于R6(高8位)和R7(低8位)
- ; 出口:转换结果存于30H-34H(30H为最高位,34H为最低位)
-
- ORG 0000H
- LJMP MAIN
- ORG 1000H
-
- MAIN: MOV R6, #030H ; 高8位示例值
- MOV R7, #39H ; 低8位示例值
- LCALL HEX2DEC ; 调用转换子程序
- STOP: SJMP STOP ; 程序暂停
-
- ; 转换子程序:R6R7 -> 30H-34H
- HEX2DEC:
- MOV 30H, #0 ; 初始化5字节缓冲区(万位)
- MOV 31H, #0 ; 千位
- MOV 32H, #0 ; 百位
- MOV 33H, #0 ; 十位
- MOV 34H, #0 ; 个位
-
- LCALL PROCESS_HIGH
-
- RET ; 转换完成返回
-
-
- ; 十进位处理子程序
- HANDLE_CARRY:
- ; 处理个位进位到十位
- MOV A, 34H
- MOV B, #10
- DIV AB ; A=商(进位), B=余数(个位)
- MOV 34H, B ; 保存个位
- MOV R0, A ; 暂存进位值
-
- ; 处理十位进位到百位 - 累加进位
- MOV A, 33H
- ADD A, R0 ; 原有十位值 + 进位
- MOV B, #10
- DIV AB ; A=商(进位), B=余数(十位)
- MOV 33H, B ; 保存十位
- MOV R0, A ; 更新进位值
-
- ; 处理百位进位到千位 - 累加进位
- MOV A, 32H
- ADD A, R0 ; 原有百位值 + 进位
- MOV B, #10
- DIV AB ; A=商(进位), B=余数(百位)
- MOV 32H, B ; 保存百位
- MOV R0, A ; 更新进位值
-
- ; 处理千位进位到万位 - 累加进位
- MOV A, 31H
- ADD A, R0 ; 原有千位值 + 进位
- MOV B, #10
- DIV AB ; A=商(进位), B=余数(千位)
- MOV 31H, B ; 保存千位
- MOV R0, A ; 更新进位值
-
- ; 处理万位进位
- MOV A, 30H
- ADD A, R0 ; 原有万位值 + 进位
- MOV 30H, A ; 保存万位(最多为65535,不会超过10)
-
- RET
-
- PROCESS_HIGH:
- MOV A, R6
- JZ PROCESS_LOW ; 高8位为0且低8位<10,处理最后一位
- ; 高8位减1,补充十位25和个位6
- DEC R6
-
- MOV A, #6
- ADD A, 34H
- MOV 34H, A
-
- MOV A, #25
- ADD A, 33H
- MOV 33H, A
-
- ; 处理各数位进位
- LCALL HANDLE_CARRY
- SJMP PROCESS_HIGH ; 再次检查高8位
-
- PROCESS_LOW:
-
- ; 低8位处理
- MOV A, R7
- MOV B, #10
- DIV AB ; 仅对低8位使用DIV
- MOV R7, A ; 保存商到低8位
- MOV A, B ; 余数作为当前十进制位
-
- ; 将余数累加到结果缓冲区的个位
- ADD A, 34H
- MOV 34H, A
-
- ; 将商累加到结果缓冲区的十位
- MOV A,R7
- ADD A, 33H
- MOV 33H, A
- MOV R7,#0
-
- ; 处理各数位进位
- LCALL HANDLE_CARRY
-
-
- RET
-
- END
复制代码
|