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 */
};
我得到了以下代码框架:
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
.
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 */
};