C结构体完成函数的汇编代码

标签 c assembly struct reverse-engineering

我得到了以下代码框架:

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 的地方。我只是不确定如何从该行确定它的大小。

我也得到了这个信息

enter image description here

还应该注意的是,指针的大小和对齐方式都是 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/

相关文章:

gcc - 无法修改数据段寄存器。尝试时抛出一般保护错误

c++ - 在 VS 中移动 [eax+4]

c++ - 如何使用指针指向结构的 vector ?

c++ - 将结构传递给函数

c - 在c中找到一个数字的回文

c - 将我自己的结构与指向数组的指针一起使用时出现段错误(核心已转储)

c - 在 C 中使用 getline() 的警告

c - 具有结构数组的快速选择具有非线性运行时间

c - 如何从 VS2005 中的 C 文件获取汇编程序输出

swift - 可失败初始化程序无法满足不可失败初始化程序要求