我是assembly新手。对于遵循我预期的简单代码,我有不同的输出。每次调用printf之前,eax的内容都会向右移动一些数字。我究竟做错了什么?谢谢。代码:;filename:testing.asm;assembleandlinkwith:;nasm-felftesting.asm&&gcc-m32-otestingtesting.oexternprintf;theCfunction,tobecalledSECTION.data;Datasection,initializedvariablesa:dd15;inta=15str:db"contentineax=%d",10,0SECT
由于我是GCC的新手,我在内联汇编代码中遇到了问题。问题是我不知道如何将C变量(UINT32类型)的内容复制到寄存器eax中。我试过下面的代码:__asm__(//IftheLSBofsrcisa0,use~src.Otherwise,usesrc."mov$src1,%eax;""and$1,%eax;""dec%eax;""xor$src2,%eax;"//Findthenumberofzerosbeforethemostsignificantone."mov$0x3F,%ecx;""bsr%eax,%eax;""cmove%ecx,%eax;""xor$0x1F,%eax;");
由于我是GCC的新手,我在内联汇编代码中遇到了问题。问题是我不知道如何将C变量(UINT32类型)的内容复制到寄存器eax中。我试过下面的代码:__asm__(//IftheLSBofsrcisa0,use~src.Otherwise,usesrc."mov$src1,%eax;""and$1,%eax;""dec%eax;""xor$src2,%eax;"//Findthenumberofzerosbeforethemostsignificantone."mov$0x3F,%ecx;""bsr%eax,%eax;""cmove%ecx,%eax;""xor$0x1F,%eax;");
在Linux(或OSX)中进行函数调用时,被调用方能否修改堆栈中参数的值?我假设因为调用者是清理它们的人,所以它们在函数调用后应该包含相同的值。但是我发现带有-O2的GCC正在修改在堆栈上传递给它的参数。我还查找了包括SystemVi386调用约定在内的文档,但找不到对此的权威答案。这是我正在调试的一些示例代码。pushl%eax#%eax=0x28call_print_anypopl%eax#%eaxisnow0x0a我假设GCC修改堆栈上的那个参数没问题,但我想知道在哪里指定它可以这样做。 最佳答案 尽管调用者(在某些调用约定中
在Linux(或OSX)中进行函数调用时,被调用方能否修改堆栈中参数的值?我假设因为调用者是清理它们的人,所以它们在函数调用后应该包含相同的值。但是我发现带有-O2的GCC正在修改在堆栈上传递给它的参数。我还查找了包括SystemVi386调用约定在内的文档,但找不到对此的权威答案。这是我正在调试的一些示例代码。pushl%eax#%eax=0x28call_print_anypopl%eax#%eaxisnow0x0a我假设GCC修改堆栈上的那个参数没问题,但我想知道在哪里指定它可以这样做。 最佳答案 尽管调用者(在某些调用约定中
当系统调用返回时,我在%eax中得到系统调用返回值,但是在输入时我得到-38,即十六进制的0xFFFFFFDA。这适用于写/读。这个数字是多少?它能否用于安全区分入口和导出? 最佳答案 系统调用条目上的eax中的-38显然是ENOSYS(函数未实现),并由arch/x86/kernel/entry_32.S中的syscall_trace_entry放置在那里。我想可以安全地假设它始终存在于系统调用入口处,但是它也可以存在于系统调用导出处,如果系统调用返回ENOSYS。就我个人而言,我一直只是在使用ptrace时跟踪我是处于系统调用入
当系统调用返回时,我在%eax中得到系统调用返回值,但是在输入时我得到-38,即十六进制的0xFFFFFFDA。这适用于写/读。这个数字是多少?它能否用于安全区分入口和导出? 最佳答案 系统调用条目上的eax中的-38显然是ENOSYS(函数未实现),并由arch/x86/kernel/entry_32.S中的syscall_trace_entry放置在那里。我想可以安全地假设它始终存在于系统调用入口处,但是它也可以存在于系统调用导出处,如果系统调用返回ENOSYS。就我个人而言,我一直只是在使用ptrace时跟踪我是处于系统调用入
voidreturn_input(void){chararray[30];gets(array);printf("%s\n",array);}在gcc中编译后,该函数转换为如下汇编代码:push%ebpmov%esp,%ebpsub$0x28,%espmov%gs:0x14,%eaxmov%eax,-0x4(%ebp)xor%eax,%eaxlea-0x22(%ebp),%eaxmov%eax,(%esp)call0x8048374lea-0x22(%ebp),%eaxmov%eax,(%esp)call0x80483a4mov-0x4(%ebp),%eaxxor%gs:0x14,%e
voidreturn_input(void){chararray[30];gets(array);printf("%s\n",array);}在gcc中编译后,该函数转换为如下汇编代码:push%ebpmov%esp,%ebpsub$0x28,%espmov%gs:0x14,%eaxmov%eax,-0x4(%ebp)xor%eax,%eaxlea-0x22(%ebp),%eaxmov%eax,(%esp)call0x8048374lea-0x22(%ebp),%eaxmov%eax,(%esp)call0x80483a4mov-0x4(%ebp),%eaxxor%gs:0x14,%e
为什么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