分类: 嵌入式
2011-07-04 15:45:05
;
; ARM汇编实现16进制相加得到10进制结果
; 如 0x7845 + 0x6587 = 14432
; Lzy 2011-7-4
;
AREA Data, DATA ; 定义数据段
Num DCD 0x7845, 0x6587 ; 定义两个32位的数
AREA main, CODE ; 定义代码段
ENTRY ; 程序入口
START
; 取数据
LDR R0, =Num
LDR R1, [R0] ; 取第一个数,加数
LDR R2, [R0, #4] ; 取第二个数,被加数
MOV R0, #0 ; 保存结果
MOV R5, #0 ; 初始化BCD进位标志
MOV R6, #0 ; 计数循环次数
LOOP
; 取低四位,移出低四位
AND R3, R1, #0x0F ; 取低四位
AND R4, R2, #0x0F
MOV R1, R1, LSR #4 ; 移出低四位
MOV R2, R2, LSR #4
; 低四位相加
ADD R0, R0, R3 ; 低四位相加,赋给R0
ADD R0, R0, R4
ADD R0, R0, R5 ; 加上进位标志
; 判断相加结果是否大于9
CMP R0, #9 ; 结果与10相比
MOVLS R5, #0 ; 没有进位
MOVHI R5, #1 ; R5保存进位
SUBHI R0, R0, #10 ; 有进位就把相应位减去10
MOV R0, R0, ROR #4 ; R0循环右移4位
ADD R6, R6, #4 ; 计数加4
; 判断两个数全为0,退出循环
CMN R1, R2 ; 两数之和是否大于0
BNE LOOP
QUIT
; 判断是否还有进位没有加
CMP R5, #0
ADDNE R0, R0, R5 ; 加上进位标志
MOVNE R0, R0, ROR #4 ; R0循环右移4位
ADDNE R6, R6, #4 ; 计数加4
RSB R6, R6, #32
MOV R0, R0, ROR R6 ; R0结果右移32-R6次得到最后结果
STOP
; 程序退出
MOV R0, #0x18
LDR R1, =0x20026
SWI 0x123456
END