大佬教程收集整理的这篇文章主要介绍了在汇编中,你如何处理C struct?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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示例对我来说已经足够了:)
@H_801_8@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编译它来轻松地@L_618_9@它,这将为您的C代码@L_618_9@汇编代码.例如:
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):
@H_52_2@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,您会看到此有效地址被压入堆栈.
@H_801_8@ @H_801_8@以上是大佬教程为你收集整理的在汇编中,你如何处理C struct?全部内容,希望文章能够帮你解决在汇编中,你如何处理C struct?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。