【问题标题】:In assembly, how do you deal with C struct?在汇编中,你如何处理 C 结构?
【发布时间】:2011-09-26 20:11:59
【问题描述】:

比如如何为这个syscall sys_wait4准备参数:

 asmlinkage long sys_wait4(pid_t pid,unsigned int __user *stat_addr, int options, struct rusage __user *ru)
1120 {

在汇编中如何处理struct rusage

在汇编中处理 struct 的 hello world 示例对我来说就足够了:)

【问题讨论】:

    标签: assembly struct x86-64 gnu-assembler


    【解决方案1】:

    struct 的成员在内存中按顺序排列,可能带有填充,并且结构的地址通常是其第一个成员的地址。

    struct Bar {
        int x;
        int y;
    };
    
    struct Foo {
        struct Bar b;
        double d;
        int i;
    };
    
    struct Foo f;
    

    假设&f0x10。那么&f.b.xFoo的第一个成员)也是0x10&f.b.y0x14,因为 f.b.x 是四个字节(假设是 32 位机器)。 &f.d0x18&f.i0x20。第一个未被f(即&f + 1)占用的地址是0x24

    所以你在汇编中需要做的就是确保你有(堆栈或堆)空间用于结构的成员,并用适当的数据填充空间,并将第一个成员的地址传递给函数.

    对于一个实际涉及汇编的示例,您可以通过编写一个小测试程序并使用gcc -S -O0 -g 编译它来轻松地自己生成它,这将为您的C 代码生成汇编代码。例如:

    int func(struct Foo * foo) {
        return foo->b.x + foo->i;
    }
    
    int main() {
        struct Foo foo;
        foo.b.x = 42;
        foo.b.y = 9;
        foo.d = 3.14;
        foo.i = 8;
        func(&foo);
        return 0;
    }
    

    在汇编输出中,您将看到(注意:这是 64 位 ASM):

    movl    $42, -32(%rbp)
    movl    $9, -28(%rbp)
    movabsq $4614253070214989087, %rax
    movq    %rax, -24(%rbp)
    movl    $8, -16(%rbp)
    

    如您所见,值 42、9(位模式为 3.14 的整数)和 8 被加载到地址 -32、-28、-24 和 -16(相对于基指针)。我手边只有一个 Solaris 盒子,所以我不能使用 asmlinkage(它指定函数参数必须在堆栈中而不是在寄存器中传递),所以在函数调用之前,我们看到了有效地址被加载到寄存器中的结构:

    leaq    -32(%rbp), %rax
    movq    %rax, %rdi
    

    使用asmlinkage,您会看到这个有效地址被压入堆栈。

    【讨论】:

    • Eldhuset,有可用的 hello world 示例吗?
    • 我认为 C99 保证结构的地址是它的第一个成员的地址。
    • @tc.:听起来很合理;我写“典型地”只是因为我不是 100% 确定是这种情况——但我看不出有任何理由要在结构的开头添加填充。
    • 我相信 C99 还可以安全地在指向以相同字段开头的结构的指针之间进行转换并访问这些字段(因此您可以将 struct sockaddr_in* 转换为 struct sockaddr*)。有一个类似的保证,这意味着您可以使用offsetof()
    • @R__:您可以通过要求编译器输出汇编来自己生成一个。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多