Итак, у меня есть код сборки, который я написал на моей виртуальной машине Linux (Manjaro, x86_64). Это выглядит следующим образом:Prinfting несколько значений в сборке
.section .rodata
.LC0:
.string "The value of a is: %d, of b: %d"
.text
.globl main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $15, -4(%rbp)
movl $20, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
ret
В основном я хочу, чтобы вставить 2 значения в регистрах, а затем как-то напечатать их (отформатированный как в .LC0
). Ну, я застрял, поэтому я просто написал программу на C и использовал gcc -S
, чтобы посмотреть, как это выглядит. Это дало мне нечто похожее на код выше. Я не понимаю две вещи:
- Если хранить 20 в
%edx
и 15 в%eax
, то почему проходит только%eax
к%esi
причинprintf
печатать значения как из%eax
и%edx
? - Почему я должен поставить нулевую постоянную каждый раз до и после
printf
(какgcc
делает?)
Предлагаю взглянуть на платформу ABI. Я считаю, что вы можете найти ссылку в информации 'assembly'-tag. – EOF
По мере добавления тегов C и gcc, пожалуйста, также покажите эквивалентную программу на C, которую вы написали. – usr2564301