2012-06-27 6 views
5

Aktualnie gram z C, C++ i ASM. Widzę, że zawsze istnieje różnica 12 między wartościami odejmowania ebp. Moja zdemontowany kod:Wartość odjęcia adresu jest zawsze 12? Czy wielkość zmiennych jest niewielka?

Kod:

int main() 
{ 
    int abc = 10; 
    int def = 20; 
    short int a = 1; 
    long int b = 1000; 

    //PlayFloat(); 

    GetValue(); 
    return 0; 
} 

Disassebled:

push  ebp 
mov   ebp,esp 
sub   esp,0F0h 
push  ebx 
push  esi 
push  edi 
lea   edi,[ebp+FFFFFF10h] 
mov   ecx,3Ch 
mov   eax,0CCCCCCCCh 
rep stos dword ptr es:[edi] 
    ;int abc = 10; 
mov   dword ptr [ebp-8],0Ah 
    ;int def = 20; 
mov   dword ptr [ebp-14h],14h 
    ;short int a = 1; 
mov   eax,1 
mov   word ptr [ebp-20h],ax 
    ;long int b = 1000; 
mov   dword ptr [ebp-2Ch],3E8h 

    ;//PlayFloat(); 

    ;GetValue(); 
call  004110EB 
    ;return 0; 
xor   eax,eax 

Ale dlaczego? Int zajmuje 4 bajty, a krótkie tylko 2 bajty. Więc dlaczego jest różnica 12? Proszę pomóż.

EDYTOWANIE: Wygląda na to samo w wydanym, wymienionym kodzie ASM. Ustawiłem to w ustawieniach.

_TEXT SEGMENT 
_b$ = -44      ; size = 4 
_a$ = -32      ; size = 2 
_def$ = -20      ; size = 4 
_abc$ = -8      ; size = 4 
_main PROC      ; COMDAT 

; 18 : { 

    push ebp 
    mov ebp, esp 
    sub esp, 240    ; 000000f0H 
    push ebx 
    push esi 
    push edi 
    lea edi, DWORD PTR [ebp-240] 
    mov ecx, 60     ; 0000003cH 
    mov eax, -858993460    ; ccccccccH 
    rep stosd 

; 19 : int abc = 10; 

    mov DWORD PTR _abc$[ebp], 10  ; 0000000aH 

; 20 : int def = 20; 

    mov DWORD PTR _def$[ebp], 20  ; 00000014H 

; 21 : short int a = 1; 

    mov eax, 1 
    mov WORD PTR _a$[ebp], ax 

; 22 : long int b = 1000; 

    mov DWORD PTR _b$[ebp], 1000  ; 000003e8H 

; 23 : 
; 24 : //PlayFloat(); 
; 25 : 
; 26 : GetValue(); 

    call _GetValue 

; 27 : return 0; 

    xor eax, eax 

; 28 : } 

    pop edi 
    pop esi 
    pop ebx 
    add esp, 240    ; 000000f0H 
    cmp ebp, esp 
    call __RTC_CheckEsp 
    mov esp, ebp 
    pop ebp 
    ret 0 
_main ENDP 
_TEXT ENDS 

Jak widać, istnieje również różnica 12.

+3

Prawdopodobnie wyrównanie. –

+0

Ale jeśli punktem wyjścia jest ebp-20, a rozmiar jest 32-bitowy, będzie to inna zmienna na adres ebp-8 .... Czy nie? – user35443

+0

Jaki kompilator, jaka wersja kompilatora, jakie przełączniki? Prosimy również o opublikowanie pełnej funkcji i związanego z nią zestawu. –

Odpowiedz

11

Jest to kod debugowania. Przestrzeń pomiędzy zmiennymi jest wypełniona przez 0CCCCCCCCh w celu wykrycia np. przekroczenie bufora.

Jestem pewna, że ​​nie zobaczysz tego w wersjach wydania. Ale musisz używać zmiennych, więc nie są one zoptymalizowane w budowaniu wersji.

+2

Nie miałem pojęcia, że ​​tryb debugowania jest tak duży. Zastrzega 240 bajtów stosu do przechowywania 14 bajtów zmiennych! –

+0

Poszukaj edytuj pls. – user35443

+0

Widzę to również w wersji Release. – user35443