Chinaunix首页 | 论坛 | 博客
  • 博客访问: 240539
  • 博文数量: 69
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 15
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 13:55
文章分类

全部博文(69)

文章存档

2016年(11)

2013年(58)

我的朋友

分类: 嵌入式

2013-03-30 22:39:24

;

;      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

 

 

阅读(2285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~