这个问题在这里已经有了答案:HowdoIprintanintegerinAssemblyLevelProgrammingwithoutprintffromtheclibrary?(5个答案)关闭2年前。所以我正在学习使用NASM语法的x86Linux程序集(天哪,又不是这个,你们都在想)。我正在尝试制作一个子例程,它将简单地将EAX中的值打印到标准输出。代码运行并退出时没有错误,但没有打印任何内容。我不知道为什么。首先,这是我正在处理的文件:segment.bssto_print:resd1segment.textglobalprint_eax_valprint_eax_val:;(t
我正在浏览一篇文章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
我编写了一个Hook库,它检查PE可执行文件dll导入表,以创建一个能够更改参数和返回值的库。我有几个关于如何从函数传递返回值的问题。我了解到函数的返回值保存在累加器寄存器中。总是这样吗?如果不是,编译器怎么知道去哪里寻找函数结果?返回类型大小呢?一个整数很容易拟合,但是更大的结构呢?调用者是否保留堆栈空间,以便它调用的方法可以将结果写入堆栈? 最佳答案 这都是特定于调用约定的。对于大多数调用约定,float在FPU堆栈或XMM寄存器中返回。调用返回结构的函数some_structfoo(intarg1,intarg2);some_
当编译为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
我刚刚尝试在VS2010上编译几个C++片段,并在IDAPro上分析了可执行文件。我注意到的是,他们中的大多数在开始时都有以下类似的内容(在调用__security_check_cookie后不久)xoreax,ebp类似的东西xorecx,ebp在底部。为什么会这样?编译器优化已关闭。 最佳答案 这些是缓冲区溢出保护方法,与编译器优化无关。MSVC将(如果您指定/GS开关)将安全cookie推送到返回地址附近的堆栈上,以便它可以检测到堆栈损坏的常见情况。堆栈损坏可能是由以下错误代码引起的:charbuff[5];strcpy(bu
我刚刚尝试在VS2010上编译几个C++片段,并在IDAPro上分析了可执行文件。我注意到的是,他们中的大多数在开始时都有以下类似的内容(在调用__security_check_cookie后不久)xoreax,ebp类似的东西xorecx,ebp在底部。为什么会这样?编译器优化已关闭。 最佳答案 这些是缓冲区溢出保护方法,与编译器优化无关。MSVC将(如果您指定/GS开关)将安全cookie推送到返回地址附近的堆栈上,以便它可以检测到堆栈损坏的常见情况。堆栈损坏可能是由以下错误代码引起的:charbuff[5];strcpy(bu