首页
社区
课程
招聘
[求助]一个数据对齐的问题,VC6.0编译出的汇编代码有问题
发表于: 2009-12-5 17:20 4655

[求助]一个数据对齐的问题,VC6.0编译出的汇编代码有问题

2009-12-5 17:20
4655
假如有个结构
typedef struct _M{
char a[3];
int   b;
char c;
}M;

M m;         
int f;            

f=m.b这样的C语句会被VC6.0编译成这样的反汇编代码是这样一种情况:把结构m的第4个字节处开始的数据赋值给f,应该是从这个结构的第3个字节处开始的数据赋值给f才对啊,怎么会出现这样的情况呢?有什么解决办法呢?

原本想直接定位b的地址,然后从该地址处取到的值,这样的表达在C语言中总觉的很别扭,而且程序就要需要多次使用这样的形式,有没什么好的方法解决这个问题呢???

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
请先学习一下结构体的对齐知识~
2009-12-5 17:36
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
解决办法是#pragma pack(push,1),不过完全没有必要~
2009-12-5 17:42
0
雪    币: 225
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
教主,你说的这种形式:#pragma pack(push,1)和网上的不大一样:#pragma pack(n)
2009-12-5 18:08
0
雪    币: 200
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我就是看看。搞不定。呵呵。!!~支持下。..呵呵。酷窝窝
2009-12-5 18:18
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
你自己实验下好了,像你这个程序,完全没有必要搞这个~
2009-12-5 18:51
0
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
楼主,请熟悉了解一下X86体系结构的优化知识。X86指令集平台下,最快的访问内存的方式是4字节对齐方式,也就是以DWORD对齐方式
你的结构体在内存中是这样的:
char char char __  ;4个字节
int                         ;4个字节
char __   __    __  ;4个字节
2009-12-7 10:16
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
如果我没理解错的话,楼主想从一个指针的偏移3处取一个整型值,简单的办法是可以定义一个模板函数或定义如下宏:
#define MIntAt3(_p) *(int*)((char*)_p+3)
2009-12-7 10:57
0
雪    币: 962
活跃值: (1681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用offsetof是标准的用法

/* Define offsetof macro */
#ifdef __cplusplus

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#endif

#else

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m)   (size_t)&(((s *)0)->m)
#endif

#endif        /* __cplusplus */
2009-12-7 12:10
0
游客
登录 | 注册 方可回帖
返回
//