草庐IT

c - 为什么除了eax还要提供orig_eax?

为什么orig_eax成员包含在sys/user.h的structuser_regs_struct中? 最佳答案 因为它在structpt_regs中,它是....http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/arch/x86/include/asm/user_32.h#L7773*isstillthelayoutusedbyusermode(thenew74*pt_regsdoesn'thaveallregistersasthekernel75*doesn'tusetheextra

c++ - 有没有更有效的方法来获取以字节为单位的 32 位整数的长度?

我想要以下小功能的快捷方式,其中性能非常重要(该函数被调用超过10.000.000次):inlineintlen(uint32val){if(val有谁知道...一个很酷的位操作技巧?提前感谢您的帮助! 最佳答案 这个怎么样?inlineintlen(uint32val){return4-((val&0xff000000)==0)-((val&0xffff0000)==0)-((val&0xffffff00)==0);}删除inline关键字,g++-O2将其编译为以下无分支代码:movl8(%ebp),%edxmovl%edx,%

c++ - 有没有更有效的方法来获取以字节为单位的 32 位整数的长度?

我想要以下小功能的快捷方式,其中性能非常重要(该函数被调用超过10.000.000次):inlineintlen(uint32val){if(val有谁知道...一个很酷的位操作技巧?提前感谢您的帮助! 最佳答案 这个怎么样?inlineintlen(uint32val){return4-((val&0xff000000)==0)-((val&0xffff0000)==0)-((val&0xffffff00)==0);}删除inline关键字,g++-O2将其编译为以下无分支代码:movl8(%ebp),%edxmovl%edx,%

c++ - 编译器在 eax 上来回生成 mov

inttest1(inta,intb){if(__builtin_expect(a由clang使用-O3-march=native编译为test1(int,int):#@test1(int,int)cmpedi,esijl.LBB0_1moveax,esiret.LBB0_1:moveax,edicdqidivesimovesi,eaxmoveax,esi#movingeaxbackandforthret为什么eax在idiv之后来回移动?gcc有类似的行为,所以这似乎是有意为之。gccwith-O3-march=native将代码编译为test1(int,int):movr8d,es

ios - X代码/LLDB : po $eax and po $r0 only display ints for __cxa_throw exceptions?

在使用LLDB研究调试异常时,我发现了以下文章和线程,以及其他提供相同信息的文章:https://www.natashatherobot.com/xcode-debugging-trick/Xcode/LLDB:Howtogetinformationaboutanexceptionthatwasjustthrown?当尝试这些的变体时,我能得到的最好结果是一个int:(lldb)po$rax106377751137688当将它插入Xcode内存查看器时,尝试将其作为base-10和hex值,似乎没有对象存储在那里。我得到诸如B80B0C160100000003...之类的结果,然后是眼

linux - pt_regs 结构中的 eax 在哪里?只有斧头存在

我正在尝试使用pt_regs结构来获取和设置寄存器,例如eax,但是编译错误告诉我pt_regs没有这样的成员eax。但是,我能够获取ax寄存器。谁能告诉我发生了什么事?我使用的是带有3.0.0内核的32位Ubuntulinux。再次感谢。 最佳答案 看看arch/x86/include/asm/ptrace.h中structpt_regs的定义.注意#ifndef__KERNEL__那里的东西,这意味着该结构的定义对于内核模式和用户模式代码是不同的。对于内核代码,pt_regs::ax可能是您需要的值。在32位系统上它应该包含%e

Linux x86 NASM - 子例程 : Print a dword from EAX

这个问题在这里已经有了答案:HowdoIprintanintegerinAssemblyLevelProgrammingwithoutprintffromtheclibrary?(5个答案)关闭2年前。所以我正在学习使用NASM语法的x86Linux程序集(天哪,又不是这个,你们都在想)。我正在尝试制作一个子例程,它将简单地将EAX中的值打印到标准输出。代码运行并退出时没有错误,但没有打印任何内容。我不知道为什么。首先,这是我正在处理的文件:segment.bssto_print:resd1segment.textglobalprint_eax_valprint_eax_val:;(t

c - (ORIG_EAX*4) 在 ptrace 调用中

我正在浏览一篇文章here并正在尝试我在下面复制的代码片段:-#include#include#include#include#include/*ForconstantsORIG_EAXetc*/intmain(){pid_tchild;longorig_eax;child=fork();if(child==0){ptrace(PTRACE_TRACEME,0,NULL,NULL);execl("/bin/ls","ls",NULL);}else{wait(NULL);orig_eax=ptrace(PTRACE_PEEKUSER,child,4*ORIG_EAX,NULL);prin

c++ - 方法调用后返回值是否总是进入 eax 寄存器?

我编写了一个Hook库,它检查PE可执行文件dll导入表,以创建一个能够更改参数和返回值的库。我有几个关于如何从函数传递返回值的问题。我了解到函数的返回值保存在累加器寄存器中。总是这样吗?如果不是,编译器怎么知道去哪里寻找函数结果?返回类型大小呢?一个整数很容易拟合,但是更大的结构呢?调用者是否保留堆栈空间,以便它调用的方法可以将结果写入堆栈? 最佳答案 这都是特定于调用约定的。对于大多数调用约定,float在FPU堆栈或XMM寄存器中返回。调用返回结构的函数some_structfoo(intarg1,intarg2);some_

c++ - 在 C 和 C++ 中调用函数时 EAX 寄存器的初始化差异

当编译为C程序或C++程序(对于Linuxx86-64)时,小程序的程序集之间有一个奇怪的区别。有问题的代码:intfun();intmain(){returnfun();}将其编译为C程序(使用gcc-O2)产生:main:xorl%eax,%eaxjmpfun但是将其编译为C++程序(使用g++-02)会产生:main:jmp_Z3funv我觉得令人费解的是,C版本使用0(xorl%eax,%eax)初始化主函数的返回值。C语言的哪个特性导致了这种必要性?编辑:确实,对于intfun(void);没有初始化eax寄存器。如果根本没有fun的原型(prototype),即:intma