我应该对这些代码做出什么改变,使其符合汇编函数调用约定?

时间:2016-03-28 18:22:01

标签: assembly arm

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

.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

1 个答案:

答案 0 :(得分:1)

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

所以你应该这样做:

.text
.global foo
foo:
    push {r4}
    ...

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

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

.text
.global foo
foo:
    push {r4,pc}
    ...

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