2017-01-27 10 views
0

Итак, у меня есть код сборки, который я написал на моей виртуальной машине 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, чтобы посмотреть, как это выглядит. Это дало мне нечто похожее на код выше. Я не понимаю две вещи:

  1. Если хранить 20 в %edx и 15 в %eax, то почему проходит только %eax к %esi причин printf печатать значения как из %eax и %edx?
  2. Почему я должен поставить нулевую постоянную каждый раз до и после printf (как gcc делает?)
+0

Предлагаю взглянуть на платформу ABI. Я считаю, что вы можете найти ссылку в информации 'assembly'-tag. – EOF

+0

По мере добавления тегов C и gcc, пожалуйста, также покажите эквивалентную программу на C, которую вы написали. – usr2564301

ответ

2

Почему я должен поставить нулевую постоянную каждый раз до и после Printf

Это две разные проблемы.

Нулевой перед темprintf соответствует x86-64 a.k.a. AMD64 SysV ABI указать количество переменных аргументов в векторе (XMMn, YMMn ...) регистров.

Zero послеprintf Эта функция возвращает значение (вероятно, return 0 в конце).

Почему передача только% eax в% esi заставляет printf печатать значения как из% eax, так и% edx?

Это не так.

Тот же ABI указывает: первый аргумент (printf форматирует указатель строки) в %rdi; второй аргумент (первый переменный аргумент) в %rsi и т. д. Дополнительный ход аргументов представляется артефактом неоптимизированного кода вывода (-O0) gcc. Если вы добавите оптимизацию (даже -Og), вы увидите, что эти бессмысленные шаги уничтожены.

+0

Итак, существуют следующие аргументы 'printf'? – FrynioS

+0

@FrynioS перейдите по ссылке, там перечислены правила. – Netch

+0

Под ссылку AMD64? – FrynioS