在汇编中,你如何处理C struct?

@H_502_0@
例如,如何为此 syscall sys_wait4准备参数:
asmlinkage long sys_wait4(pid_t pid,unsigned int __user *stat_addr,int options,struct rusage __user *ru)
1120 {

如何处理装配中的结构浪费?

在程序集中处理struct的hello world示例对我来说已经足够了:)

解决方法

结构的成员按顺序排列在内存中,可能使用填充,结构的地址通常是其第一个成员的地址.
struct Bar {
    int x;
    int y;
};

struct Foo {
    struct Bar b;
    double d;
    int i;
};

struct Foo f;

假设& f是0x10.然后,& f.b.x(Foo第一个成员的第一个成员)也是0x10. & f.b.y是0x14,因为f.b.x是4个字节(假设是32位机器). & f.d是0x18,& f.i是0x20.未被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(它指定函数参数必须在堆栈而不是寄存器中传递),所以在函数调用之前,我们看到struct的有效地址被加载到寄存器:

leaq    -32(%rbp),%rdi

使用asmlinkage,您会看到此有效地址被压入堆栈.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...