2012-06-27 16 views
5

Şu anda C, C++ ve ASM ile oynuyor. Ebp çıkarma değerleri arasında her zaman 12 fark olduğunu görebiliyorum. Benim demonte kodu:Adres çıkarma değeri 12 mi? Değişkenlerin büyüklüğü hafif mi?

Kodu:

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 

Ama neden? Int 4 bayt alır ve sadece 2 bayt kısalır. Peki neden 12 fark var? Lütfen yardım et.

DÜZENLEME: Yayımlanan listelenen asm kodunda aynı gibi görünüyor. Bunu ayarlara ayarladım. Gördüğünüz gibi

_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 

Bu ayıklama kodu da 12.

+3

Muhtemelen hizalama. –

+0

Ancak başlangıç ​​noktası ebp-20 ise ve boyutu 32 bit ise, ebp-8 adresindeki başka bir değişkende olacaktır .... Bu değil mi? – user35443

+0

Ne derleyici, derleyicinin hangi sürümü, hangi anahtarlar? Ayrıca, lütfen eksiksiz bir işlev ve ilişkili montajı gönderin. –

cevap

11

farkı var. Değişkenler arasındaki boşluk, ör., Tespit etmek için 0CCCCCCCCh ile doldurulur. arabellek taşması.

Sürüm oluşturma işlemlerinde bunu görmeyeceğinize eminim. Ama aslında değişkenleri kullanmanız gerekiyor, bu yüzden sürüm oluşturmada optimize edilmiyorlar.

+2

Hata ayıklama modunun çok fazla yük getirdiğinden hiçbir fikrim yoktu. 14 bayt değişkene sahip olmak için 240 bayt yığın ayırıyor! –

+0

Düzenlemeye devam pls. – user35443

+0

Ayrıca sürüm oluşturmada da görebiliyorum. – user35443