嵌入式 ARM 汇编编程例题

文章目录

用汇编语言实现 128 位数的减法。

第一个 128 位数由高到低位于 R7~R4 中
第二个 128 位数由高到低位于 R11~R8 中

SUBS	R0,R4,R8
SBCS	R1,R5,R9
SBCS	R2,R6,R10
SBC		R3,R7,R11

已知 32 位变量 X、Y 存放在存储器的地址 0x90010、0x90014 中,要求实现 Z=X+Y,其中 Z 的值存放在 0x90018 中

	   AREA EX4_41,CODE,READONLY
       ENTRY
       CODE32
START  LDR R0,=0x90010       ;变量 X 的地址送入 R0
       LDR R1,[R0],#4        ;变量 X 的值读入 R1
       LDR R2,[R0],#4        ;变量 Y 的值读入 R2
       ADD R1,R1,R2          ;X+Y 结果存入 R1
       STR R1,[R0]           ;结果存入 z 中
       B START
       END   

已知 32 位有符号数 X 存放在存储器的地址 0x90010 中,要求实现:

在这里插入图片描述
其中 Y 的值存放在 0x90010 中

	   AREA EX4_42,CODE,READONLY
       ENTRY
       CODE32
START  LDR R1,=0x90010       ;加载变量 X 的地址->R1
       MOV R0,#0             ;0->R0
       LDR R2,[R1]           ;将 X 的值加载到 R2
       CMP R2,#0             ;X 与 0 比较 , 影响标志位
       SUBLT R2,R0,R2        ;X<0 执行该语句 , 提到-X
       STR R2,[R1]           ;保存结果
       B START
       END

已知 32 位有符号数 X 存放在存储器的地址 0x90010 中,要求实现

在这里插入图片描述
其中 Y 的值存放在 0x90010 中。

	   AREA EX4_43,CODE,READONLY
       ENTRY
       CODE32
START  LDR R1,=0x90010       ;加载变量 X 的地址->R1
       LDR R2,[R1]           ;加载 X 的值->R2
       CMP R2,#0             ;与 0 比较
       BEQ ZERO              ;为 0 则跳转到 ZERO 处理
       BGT PLUS              ;大于 0 则跳转到 PLUS 处理
       MOV R0,#-1            ;否则小于 0, 将 R0 设置为-1
       B FINISH              ;跳转到结束
PLUS   MOV R0,#1             ;大于 0, 将 R0 设置为 0
       B FINISH              ;跳转到结束
ZERO   MOV R0,#0             ;等于 0, 将 R0 设置为 0
FINISH STR R0,[R1]           ;将结果 R0 保存
       B START
       END 

多分支 ARM 汇编的程序

	   AREA EX4_44,CODE,READONLY
       ENTRY
       CODE32
START  CMP R0,#8             ;与 8 比较
       ADDLT PC,PC,R0,LSL#2  ;小于 8 则根据 R0 计算跳转地址 ,
                             ;并用该地址修改 PC      
       B method_d            ;大于 8 程序跳转到默认分支段执行
       B method_0            ;分支表结构 , 其偏移量由 R0 决定
       B method_1
       B method_2
       B method_3
       B method_4
       B method_5
       B method_6
       B method_7
method_0                     ;method_0 的入口
       MOV R0,#1             ;method_0 的功能
       B end0
method_1                     
       MOV R0,#2             
       B end0
method_2                     
       MOV R0,#3             
       B end0
method_3                     
       MOV R0,#4             
       B end0
method_4                     
       MOV R0,#5             
       B end0
method_5                     
       MOV R0,#6             
       B end0
method_6                     
       MOV R0,#7             
       B end0
method_7                     
       MOV R0,#8             
       B end0
method_d                     
       MOV R0,#0             
end0   B START
       END

编制程序使 S=1+2×3+3×4+4×5+……+N(N+1),直到 N 等于 10 为止。

	   AREA EX4_45,CODE,READONLY
       ENTRY
       CODE32
START  MOV R0,#1             ;R0 用作累加 , 置初值 1,S
       MOV R1,#2             ;R1 用作第一个乘数 , 初值为 2,N
REPEAT ADD R2,R1,#1          ;R2 用作第二个乘
  • 50
    点赞
  • 419
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值