gpt4 book ai didi

C++ 变量地址和对齐 | x86

转载 作者:行者123 更新时间:2023-11-30 05:40:24 25 4
gpt4 key购买 nike

我在 VS2010 中有以下代码:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a = 5;
char b = 'c';
int c = 7;
char e = 'y';
return 0;
}

这就是反汇编的样子:

int _tmain(int argc, _TCHAR* argv[])
{

00E01380 55 push ebp
00E01381 8B EC mov ebp,esp
00E01383 81 EC 00 01 00 00 sub esp,100h
00E01389 53 push ebx
00E0138A 56 push esi
00E0138B 57 push edi
00E0138C 8D BD 00 FF FF FF lea edi,[ebp-100h]
00E01392 B9 40 00 00 00 mov ecx,40h
00E01397 B8 CC CC CC CC mov eax,0CCCCCCCCh
00E0139C F3 AB rep stos dword ptr es:[edi]
int a = 5;
*00E0139E* C7 45 F8 05 00 00 00 mov dword ptr [a],5
char b = 'c';
*00E013A5* C6 45 EF 63 mov byte ptr [b],63h
int c = 7;
*00E013A9* C7 45 E0 07 00 00 00 mov dword ptr [c],7
char e = 'y';
*00E013B0* C6 45 DB 79 mov byte ptr [e],79h
return 0;
00E013B4 33 C0 xor eax,eax
}

我在 64 位系统上工作。当我查看地址时,我不明白它们是如何对齐的。我希望它们是 8 字节对齐的。见下文:

00E0139E   - here starts int a, 4 byte integer
9F - int a
A0 - int a
A1 - int a
A2 - padding
A3 - padding
A4 - padding
A5 - char b, 1 byte
-end of word
A6 - padding???
A7 - padding???
A8 - padding???
A9 - here starts int c, why?
AA - int c
AB - int c
AC - int c
AD - padding???
-end of word
AE - padding???
AF - padding???
B0 - char e, why?

这让我很困惑。有人可以帮助我了解发生了什么吗?这似乎不是存储变量的有效方法。一定是我漏掉了什么。

PS:项目选项中禁用了优化。我也试过了

#pragma runtime_checks( "su", off )

但它并没有改变任何东西。

最佳答案

您正在查看代码地址,即。指令所在的位置,而不是数据在内存中的位置。地址就是它们的本来面目,因为指令占用的字节数可变,而这正是这些特定指令需要的字节数。

也就是说,如果您查看实际的反汇编,您会发现变量没有有效地打包。但是,在禁用优化的情况下,这并不意外。对于初学者,您可以看到编译器使用 sub esp,100h 为您的本地人分配了高达 256 个字节。然后变量赋值如下:

c745f805000000 mov DWORD PTR [ebp-0x8],0x5
c645ef63 mov BYTE PTR [ebp-0x11],0x63
c745e007000000 mov DWORD PTR [ebp-0x20],0x7
c645db79 mov BYTE PTR [ebp-0x25],0x79

关于C++ 变量地址和对齐 | x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31654886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com