2013-11-02 2 views
5
 .file "calc.c" 
     .text 
.globl calc 
     .type calc, @function 
calc: 
     pushl %ebp  
     movl %esp, %ebp 
     movl 8(%ebp), %edx 
     movl 16(%ebp), %ecx 
     leal (%edx,%edx,2), %edx 
     movl 12(%ebp), %eax 
     leal (%edx,%eax,2), %eax 
     movl %ecx, %edx 
     sall $4, %edx 
     subl %ecx, %edx 
     addl %edx, %eax 
     popl %ebp 
     ret 
     .size calc, .-calc 
     .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" 
     .section  .note.GNU-stack,"",@progbits 

Я пытаюсь понять, что происходит с этим кодом сборки. Я создал его, набрав gcc -O1 -S calc.c, который сгенерировал файл сборки calc.s.Понимание сборки, сгенерированной вызовом функции C

Может кто-нибудь объяснить (с точки зрения добавления и умножения в calc.c), что происходит, по строкам?

Исходный код С:

int calc(int x, int y, int z) 
{ 
     return 3*x + 2*y + 15*z; 
} 
+3

Вы создали неиспользуемый вложенную функцию, которая была оптимизирована так, это не в списке сборок. Удалите функцию «main» и повторите попытку. – Jester

+0

Возможно, у вас есть опечатка '.global calc' – silentboy

+0

Извините. Я исправил код. (сборка и c) –

ответ

9

Хорошо, теперь это что-то, я аннотацию для вас

calc: 
    pushl %ebp   ; \ 
    movl %esp, %ebp  ;/set up basic stack frame 
    movl 8(%ebp), %edx ; load x 
    movl 16(%ebp), %ecx ; load z 
    leal (%edx,%edx,2), %edx ; calculate x + 2 * x 
    movl 12(%ebp), %eax ; load y 
    leal (%edx,%eax,2), %eax ; calculate (x + 2 * x) + (2 * y) 
    movl %ecx, %edx  ; make a temp copy of z 
    sall $4, %edx  ; calculate z * 16 
    subl %ecx, %edx  ; calculate (z * 16) - z 
    addl %edx, %eax  ; calculate final sum 
    popl %ebp 
    ret 
+0

Спасибо @harold. Откуда вы знаете, что загружаются x, y и z? Я не понимаю, как сказать «8'' 16» и «12», что эти переменные ссылаются. –

+1

Отличный ответ! Некоторая дополнительная информация: C толкает аргументы функции в стек в обратном порядке, а 'int' имеет длину 4 байта. –

+1

Я немного обманул и понял их смысл из того, что с ними делается. Вы также можете найти соглашение о вызове 'cdecl' и посмотреть, какой аргумент-индекс у них есть на основе смещения. – harold

Смежные вопросы