我得到了以下代码框架:
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 个字节长( double )。另外,我认为结构“节点”的总大小来自行
movl n+12, %eax
因为这是创建node_t *m 的地方。我只是不确定如何从该行确定它的大小。
我也得到了这个信息
还应该注意的是,指针的大小和对齐方式都是 4 个字节。
最佳答案
在 32 位模式下,指针为 4 字节,通常在 4 字节边界上对齐。所以n + 12
实际上是将& n.next
加载到%eax
。例如,如果y
是一个无符号短
,则结构中在next
之前有2个字节的填充。
movl 16(%eax),%eax
使用 16 字节偏移量取消引用,得到:m = n.next->prev
struct node
{
double x; /* bytes: 0 .. 7 */
unsigned short y; /* bytes: 8 .. 9 */
/* bytes: 10 .. 11 */ /* (padding) */
struct node *next; /* bytes: 12 .. 15 */
struct node *prev; /* bytes: 16 .. 19 */
};
关于C结构体完成函数的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721288/