Как да използвате printf в асемблерния език на raspberry pi

printf има ли ограничение за броя на стойностите, които можете да отпечатате?

Ето моят код.

.data
.balign 4       
   string: .asciz "\n%d %d %d %d\n"        
.text
.global main
.extern printf

main:
    push    {ip, lr}        @ push return address + dummy register
                            @ for alignment
    ldr     r0, =string     @ get address of string into r0
    mov     r1, #11
    mov     r2, #22
    mov     r3, #33
    mov     r4, #444
    bl      printf          @ print string and pass params
                            @ into r1, r2, and r3
    pop     {ip, pc}        @ pop return address into pc

Когато компилирам и изпълня този код, той отпечатва това:

11 22 33 1995276288

Както можете да видите, стойността в R4 не отпечатва правилната стойност.

Не знам защо?


person Daniel Robert Webb    schedule 05.11.2016    source източник
comment
Тъй като само първите 4 аргумента се предават в регистрите. Звучи сякаш сте забравили да прочетете документацията за конвенцията за повиквания.   -  person Jester    schedule 05.11.2016


Отговори (1)


Само първите 4 аргумента се предават в регистрите (r0-r3) на ARM -- всички допълнителни аргументи се предават на стека. Разгледайте ABI за извикване на процедурата за подробности.

person Chris Dodd    schedule 05.11.2016
comment
Това обяснява проблема. Благодаря - person Daniel Robert Webb; 06.11.2016
comment
@DanielRobertWebb: тогава трябва да щракнете върху отметката върху този отговор. - person Peter Cordes; 06.11.2016