首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该对这些代码做哪些修改,使其符合汇编函数调用约定?

我应该对这些代码做哪些修改,使其符合汇编函数调用约定?
EN

Stack Overflow用户
提问于 2016-03-28 18:22:00
回答 1查看 37关注 0票数 0

函数是foo,它基本上是计算values数组中的数量。

代码语言:javascript
复制
.data
.balign 4
values:
    .word 1
    .word 0
    .word 1 
    .word 2
    .word 1

.balign 4
count: .word 0
.balign 4
return .word 0

.text
.global foo
foo:
    mov r3, #0
    mov r2, #4
    mul r2, r1, r2
    add r2,r0,r2
    mov r4,#1

foo_loop:
    cmp r0,r2
    beq foo_exit
    ldr r1,[r0]
    cmp r1,r4
    beq foo_eq
    add r0,r0,#4
    b foo_loop

foo_eq:
    add r3,r3,#1
    add r0,r0,#4
    b foo_loop

foo_exit:
    mov r0,r3
    bx lr

.global main
main:
    ldr r1, =return
    str lr, [r1]

    ldr r0, =values
    mov r1,#5
    bl foo
    ldr r1, =count
    str r0,[r1]
    ldr lr, =return
    ldr lr,[lr]
    bx lr
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-29 19:22:04

我看到的唯一不正确的地方是在函数中使用寄存器r4而不保存它。只有寄存器r0-r3可以用作参数和划痕寄存器。

所以你要么这样做:

代码语言:javascript
复制
.text
.global foo
foo:
    push {r4}
    ...

foo_exit:
    mov r0,r3
    pop {r4}
    bx lr

或者(将PC也保存在堆栈中):

代码语言:javascript
复制
.text
.global foo
foo:
    push {r4,pc}
    ...

foo_exit:
    mov r0,r3
    pop {r4,lr}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36268467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档