2016-10-13 5 views
0

Вот мой код, прежде чем я объясняю свою проблему:ARMv8 Печать нескольких строк с тем же числом Reference

Я новичок в 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 

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

Результат:

constant = 5 low value = -1000 

    constant = 0 

благодаря

+1

Вы сделали «mov x3, x19» вместо 'mov x1, x19'. – Jester

+0

Ничего себе. Не видел этого. благодаря! – Weissman

ответ

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 
Смежные вопросы