C struct 完成函数的汇编代码

C struct to complete assembly code for function

我得到了以下代码框架:

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 ,8(%eax)
  popl %ebp
  ret

我需要填写上面的空白。我确实相信,当我看他的台词时:

m->y /= 16; and shrw ,8(%eax)

这显然是node_t *m的第8个字节的右移。所以我认为在 y 之前有 8 个字节,所以 x 是 8 个字节长(双)。另外,我认为结构 'node' 的总大小来自行

movl n+12, %eax

因为那是创建 node_t *m 的地方。我只是不确定如何从那一行确定它的大小。

我也给了这个信息

还需要注意的是,指针的大小和对齐都是4字节。

在 32 位模式下,指针为 4 个字节,通常在 4 字节边界上对齐。所以n + 12实际上是加载& n.next%eax。例如,如果 y 一个 unsigned short,在 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 */
};