ARMv8 Печать нескольких строк с одинаковым номером

Вот мой код, прежде чем я объясню свою проблему:

Кстати, я новичок в 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

Теперь по какой-то причине во время "print" он печатает "constant = 5" просто отлично. Однако, когда он идет к "print2", он печатает "constant = 0". Что происходит, и почему он не печатает до 5, хотя я еще не манипулировал регистром x19? Я не совсем понимаю, как они работают.

Результат:

  constant = 5    low value = -1000

  constant = 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
Другие вопросы по тегам