ARMv8打印具有相同编号参考的多个字符串

时间:2016-10-13 18:46:49

标签: assembly printing arm arm64

在解释我的问题之前,这是我的代码:

顺便说一下,我是ARM的新手,所以我是一个超级新手。现在,我只是删除了代码中不必要的部分。 x0 - x7是“参数”寄存器,x29是帧指针,x30是链接寄存器。 x19和x20只是被调用者保存的寄存器。

string1:        .string "constant = %d   low value = %d \n\n"
string2:        .string "constant = %d \n"


                .balign 4
                .global main

main:           stp     x29,    x30,    [sp,    -16]!
                mov     x29,    sp

                mov     x20,    -1000         // Setting values
                mov     x19,    5

print:          adrp    x0,    string1
                add     x0,    x0,     :lo12:string1
                mov     x1,    x19
                mov     x2,    x20
                bl      printf

print2:         adrp    x0,    string2
                add     x0,    x0,     :lo12:string2
                mov     x3,    x19
                bl      printf


done:           mov x0, 0

end:            ldp     x29,   x30,   [sp],   16
                ret

现在由于某种原因,在“打印”期间,它打印出“常量= 5”就好了。然而,当它进入“print2”时,它打印出“constant = 0”。发生了什么,为什么它不打印到5,即使我没有操纵寄存器x19呢?我不完全掌握这些是如何工作的。

结果:

  constant = 5    low value = -1000

  constant = 0

感谢

1 个答案:

答案 0 :(得分:1)

如果要创建常规函数,与在主代码部分的主体中插入此类函数相比,这里有一些代码来填充ARMv8泵。我的.include只适用于我的宏(即push2& pop2等);这与您使用的代码相同。

 .data
        string1:        .string "constant = %d low value = %d\n\n"
        string2:        .string "constant = %d \n"
.text
        .global main
        .include "mymac_armv8.s"        // for push2, pop2, and _exit macros

main:
        movn x20, 1000
        mov x19, 5

        bl write1
        bl write2

_exit

write1:
        push2 x29, x30
        push2 x1, x2
        ldr x0,=string1
        mov x1, x19
        mov x2, x20
        bl printf
        pop2 x1, x2
        pop2 x29, x30
        ret

write2:
        push2 x29, x30
        push2 x1, x2
        ldr x0,=string2
        mov x1, x19
        mov x2, x20
        bl printf
        pop2 x1, x2
        pop2 x29, x30
        ret