.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}
编写以下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=

原文地址: https://www.cveoy.top/t/topic/b0Ui 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录