【发布时间】:2015-04-27 13:56:17
【问题描述】:
我得到了以下代码框架:
typedef struct node {
_______________ x;
_______________ y;
struct node *next;
struct node *prev;
} node_t;
node_t n;
void func() {
node_t *m;
m = ______________________;
m->y /= 16;
return;
}
在 IA-32 linux 机器上生成以下汇编代码:
func:
pushl %ebp
movl n+12,%eax
movl 16(%eax),%eax
movl %esp,%ebp
movl %ebp,%esp
shrw $4,8(%eax)
popl %ebp
ret
我需要填写上面的空白。我确实相信,当我看到他的台词时:
m->y /= 16; and shrw $4,8(%eax)
这显然是 node_t *m 的第 8 个字节的右移。所以我认为在 y 之前有 8 个字节,所以 x 是 8 个字节长(双)。另外,我认为 struct 'node' 的总大小来自行
movl n+12, %eax
因为这是创建 node_t *m 的地方。我只是不确定如何从该行确定它的大小。
我也提供了这个信息
还应注意,指针的大小和对齐方式为 4 个字节。
【问题讨论】:
-
@T.C.感谢您指出了这一点。我编辑了它。
-
shrw $4, 8(%eax)表明m->y是unsigned short。有符号值通常使用sar(算术右移)。 -
@BrettHale 是因为它是单词后面的 w 吗?意思是两个字节?
-
@scottybobby - 你明白了。
b、w、l、q为 1、2、4、8 个字节。 -
您获得的表格不包括指针的大小和对齐方式(例如 struct node *)。
标签: c assembly struct reverse-engineering