编写以下C代码功能的ARM汇编程序要求:1 参数传递使用r0-r3返回值用r0栈指针用r13。2 子过程调用时用LDMSTM指令进行相应的栈操作、保存必要的工作寄存器和LR寄存器栈为一个向地址减少方向生长的满栈。3 每条指令都有相应的注释 int sub int x1 int x2 int x3 return x1-x2-x3; int acc int r for i=
.global main main: @ 将栈指针初始化 mov r13, #0x8000
@ 存储a、b、c、d到栈中
stmia r13!, {r0-r3}
@ 计算x=b+a
ldr r0, [r13, #16] @ r0 = b
ldr r1, [r13, #12] @ r1 = a
add r2, r0, r1 @ r2 = b+a
@ 计算y=c-d
ldr r0, [r13, #20] @ r0 = c
ldr r1, [r13, #24] @ r1 = d
sub r3, r0, r1 @ r3 = c-d
@ 判断x和y是否相等
cmp r2, r3
bne .else
@ x和y相等,调用sub函数
ldr r0, [r13, #12] @ r0 = x1 = a
ldr r1, [r13, #16] @ r1 = x2 = b
ldr r2, [r13, #20] @ r2 = x3 = c
bl sub @ 调用sub函数,返回值存储在r0中
b .end @ 跳转到程序结束
.else: @ x和y不等,调用acc函数 ldr r0, [r13, #12] @ r0 = r = a mov r1, #0 @ i = 0 .loop: cmp r1, #5 @ 判断i是否小于等于5 bgt .next @ 如果i>5,跳到.next add r0, r0, r1 @ r = r+i add r1, r1, #1 @ i = i+1 b .loop @ 循环 .next: mov r1, #0 @ 存储返回值 mov r1, r0
.end: @ 将返回值存储到栈中 str r0, [r13, #28]
@ 从栈中恢复a、b、c、d
ldmia r13!, {r0-r3}
@ 程序结束
mov r0, #0
bx lr
.sub: @ 存储必要的寄存器到栈中 push {r4-r6, lr}
@ 计算x1-x2-x3
sub r0, r0, r1 @ r0 = x1-x2
sub r0, r0, r2 @ r0 = x1-x2-x3
@ 恢复必要的寄存器
pop {r4-r6, pc}
.acc: @ 存储必要的寄存器到栈中 push {r4-r6, lr}
@ 循环计算r+i
add r1, r0, #5 @ r1 = 5
.loop: cmp r0, r1 @ 判断r是否小于等于5 bgt .next @ 如果r>5,跳到.next add r4, r4, r0 @ r4 = r4+r add r0, r0, #1 @ r = r+1 b .loop @ 循环 .next: mov r0, r4 @ 返回值存储在r0中
@ 恢复必要的寄存器
pop {r4-r6, pc}
原文地址: https://www.cveoy.top/t/topic/b0Ui 著作权归作者所有。请勿转载和采集!