Я пытаюсь изучать x86 самостоятельно и решил проанализировать простую программу на c и посмотреть, что выводит GCC.Программа выглядит так:
#include <stdio.h>
int main() {
printf("%s","Hello World");
return 0;
}
Я скомпилировал код с -S, а затем удалил то, что мне показалось ненужным, и уменьшил код сборки до этого.
.pfArg:
.string "%s"
.text
.Hello:
.string "Hello World"
.text
.globl main
.type main, @function
main:
pushq %rbp # push what was in base pointer onto stack
movq %rsp, %rbp # move stack pointer to base pointer
subq $16, %rsp # subtract 16 from sp and store in stack pointer
# prepare arguments for printf
movl $.Hello, %esi # put & of "Hello World" into %esi
movq $.pfArg, %rdi # put & of "%d" into %eax
call printf
leave
ret
Теперь почти всев приведенном выше коде имеет смысл для меня, кроме первых двух под основной.Хотя это то, что я получаю, не разбирая вещи.
.LC0:
.string "%s"
.LC1:
.string "Hello World"
.text
.globl main
.type main, @function
main:
.LFB0:
pushq %rbp # push what was in base pointer onto stack
movq %rsp, %rbp # move stack pointer to base pointer
# prepare arguments for printf
movl $.LC0, %eax # put arg into %eax
movl $.LC1, %esi # put second arg into %esi
movq %rax, %rdi # move value in %rax to %rdi ???? ( why not just put $.LCO into %rax directly )
movl $0, %eax # clear out %eax ???? ( why do we need to clear it out )
call printf
movl $0, %eax # return 0
leave
ret
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
.section .note.GNU-stack,"",@progbits
Есть 2 инструкции, которые я пометил ????что я не понимаю
Первая инструкция перемещает содержимое% rax в% rdi для подготовки к вызову printf.Это нормально, за исключением того, что мы только что переместили $ .LC0 (это строка "% s") в% eax.Это кажется ненужным, почему мы просто не переместили $ .LC0 в% rdi, а не переместили его в% eax, а затем в% rdi?
Вторая инструкция очищает% eax, который я понимаюбыть возвращаемым значением функции.Но если в любом случае функция просто закроет ее, почему GCC заботится об ее очистке?