c++ - 地址减法值总是12?变量的大小是否很小?

标签 c++ c assembly integer size

我目前正在研究 C、C++ 和 ASM。我可以看到 ebp 减法值之间始终存在 12 的差异。我的反汇编代码:

代码:

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

    //PlayFloat();

    GetValue();
    return 0;
}

已禁用:

 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

但是为什么? Int 占 4 个字节,而 short 只占 2 个字节。那么为什么会有12的差异呢?请帮忙。

编辑: 在已发布的列出的 asm 代码中似乎是相同的。我已经在设置里设置过了。

_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

如您所见,也有 12 的差异。

最佳答案

这是调试代码。变量之间的空间用 0CCCCCCCCh 填充以检测例如。缓冲区溢出。

我相信您不会在发布版本中看到这一点。但是您必须实际使用这些变量,因此它们不会在发布构建中被优化掉。

关于c++ - 地址减法值总是12?变量的大小是否很小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11228404/

相关文章:

c++ - 使用点后模板函数的特化会破坏编译

c++ - 将 R/O 分区挂载为 R/W 进行写入,然后在 C 中设置回 R/O

assembly - 在汇编程序中交换最高有效字节和最低有效字节

assembly - bool 值 "notted"是如何汇编的?

pointers - 在方括号中添加两个寄存器是什么意思?

c++ - 堆栈内存由动态分配的对象成员变量引用

c++ - 如何使用 native 模块将请求映射到 IIS 7 中的处理程序

c - 我可以使用什么逻辑条件来跳过 f = .8 和 f = .4 的逻辑行?

C++ 异常处理和枚举作用域

子进程可以更改父进程共享的静态变量吗?