Закончен ли этот код сборки? - PullRequest
3 голосов
/ 27 марта 2012

Я написал этот простой код C и скомпилировал его с использованием Visual Studio 2010 с выводом на ассемблере.

int main(){
    int x=1;
    int y=2;
    int z=x+y;
    return 0;
}  

И это вывод сборки ..

; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.40219.01 

    TITLE   foobar.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat

INCLUDELIB OLDNAMES

EXTRN   @__security_check_cookie@4:PROC
PUBLIC  _main
; Function compile flags: /Ogtp
; File foobar.cpp
;   COMDAT _main
_TEXT   SEGMENT
_main   PROC                        ; COMDAT

; 2    :    int x=1;
; 3    :    int y=2;
; 4    :    int z=x+y;
; 5    :    return 0;

    xor eax, eax

; 6    : }

    ret 0
_main   ENDP
_TEXT   ENDS
END

Это завершено??Я не вижу ни одного заявления ADD.Какой компилятор можно использовать для его компиляции?

1 Ответ

7 голосов
/ 27 марта 2012

Поскольку ваш код не не делает ничего с этими значениями, компилятор оптимизировал большинство из них.Как упоминал Карл, все, что остается, это xor eax, eax, который равен нулю, регистр, в который помещается возвращаемое значение.

Даже если бы вы были printf("%d", z), ваш результат z является константой времени компиляции (3), и это все, что вы увидите в списке сборки.

Что вы можете сделать, это отключить оптимизации в свойствах вашего проекта C ++, и вы должны увидеть ожидаемую сборку.Кроме того, сборка в режиме Release должна минимизировать дополнительные отладочные материалы, которые вы видите в asm.

...