在汇编程序中,.text部分加载到0x08048000;.data和.bss部分紧随其后。如果我不在.text部分放置一个exit系统调用会发生什么?它会导致.data和.bss部分被解释为导致“不可预测”行为的代码吗?程序什么时候终止——可能是在每条“指令”执行完之后?我可以在没有exit系统调用的情况下轻松编写程序,但是我不会测试.data和.bss是否被执行不知道,因为我想我必须知道在后台生成的真实机器代码才能理解这一点。我认为这个问题更多的是关于“操作系统和CPU将如何处理这种情况?”比汇编语言,但对于汇编程序员等来说仍然很有趣。 最佳答案
我正在阅读一些linux汇编手册,发现了使用printf()函数的想法。出于调试原因,我需要它以二进制形式将寄存器值输出到终端,但现在我只是尝试用文本测试该功能。我被卡住了,因为当我使用pushq而不是pushl时出现段错误。如何更改此程序以输出字符串和二进制形式的寄存器?.datainput_prompt:.string"Hello,world!"printf_format:.string"%5d"printf_newline:.string"\n"size:.long0.text.globlmainmain:pushq$input_promptcallprintfmovl$0,%e
是否有在Linux上运行的反汇编程序能够将x86ELF可执行文件反汇编为Intel语法中的汇编代码(即操作目标寄存器、源寄存器;等)?输出反汇编器最好与NASM语法相当接近。objdump-d工作得很好,但输出的AT&T语法有时我觉得很难理解,而ndiasm仅反汇编我所知的二进制文件。 最佳答案 您可以告诉objdump使用Intel语法:objdump-Mintel-d 关于linux-反汇编为Intel语法的x86ELF反汇编程序,我们在StackOverflow上找到一个类似的问题
如果我将崩溃程序和核心转储加载到gdb中,它会显示堆栈跟踪和崩溃点,如下所示。Corewasgeneratedby`./cut--output-d=:-b1,1234567890-/dev/fd/63'.ProgramterminatedwithsignalSIGSEGV,Segmentationfault.#0is_printable_field(i=1234567890)atsrc/cut.c:266266return(printable_field[n]>>(i%CHAR_BIT))&1;(gdb)bt#0is_printable_field(i=1234567890)atsrc
我一直在看汇编教程,我正在尝试运行一个helloworld程序。我在Windows上的Ubuntu上使用Bash。程序集如下:section.textglobal_start;mustbedeclaredforlinker(ld)_start:;tellslinkerentrypointmovedx,len;messagelengthmovecx,msg;messagetowritemovebx,1;filedescriptor(stdout)moveax,4;systemcallnumber(sys_write)int0x80;callkernelmoveax,1;systemcal
有人能告诉我如何从汇编语言生成可执行文件吗?我的环境是Ubuntu+Emacs+GCC为了学习的目的,我写了一些C代码(hello.c)并将其转换为汇编(hello.s)我想从一个汇编文件中生成一个可执行文件。我试过了M-xcompilegcchello.c-S从C代码编译和M-xcompileashello.s生成可执行文件但是只有一个.out文件,无法执行所以我试过了ashello.s-oaaa但是文件“aaa”不可执行 最佳答案 as的输出是一个目标文件。要使其可执行,您需要将其与ld链接,但您还需要链接它所依赖的任何对象,如
我正在尝试定义一些在其中调用printf的子例程。一个非常简单的例子如下:externprintfLINUXequ80HEXITequ60section.dataintfmt:db"%ld",10,0segment.textglobalmainmain:callos_return;returntooperatingsystemos_return:movrax,EXIT;Linuxsystemcall60i.e.exit()movrdi,0;Errorcode0i.e.noerrorsintLINUX;InterruptLinuxkerneltest:pushrdipushrsimovr
我为amd64编写了这个小汇编文件。代码的作用对于这个问题并不重要。.globlfibfib:mov%edi,%ecxxor%eax,%eaxjrcxz1flea1(%rax),%ebx0:add%rbx,%raxxchg%rax,%rbxloop0b1:ret然后我开始在Solaris和Linux上组装然后反汇编它。太阳系$as-oy.o-xarch=amd64-Vy.sas:SunCompilerCommon12.1SunOS_i386Patch141858-042009/12/08$disy.odisassemblyfory.osection.text0x0:8bcfmovl%e
比如说,我想在gcc的内联汇编中调用具有以下签名的函数。我该怎么做?intsome_function(void*arg); 最佳答案 通常你会想做类似的事情void*x;asm("..codethatwritestoregister%0":"=r"(x):...intr=some_function(x);asm("..codethatusestheresult...":...:"r"(r),...也就是说,您根本不想在内联汇编中进行函数调用。这样您就不必担心调用约定或堆栈框架管理的细节。
LinuxAssemblyTutorial状态:thereisoneveryimportantthingtoremember:Ifyouareplanningtoreturnfromaprocedure(withtheRETinstruction),don'tjumptoit!Asin"never!"DoingthatwillcauseasegmentationfaultonLinux(whichisOK–allyourprogramdoesisterminate),butinDOSitmayblowupinyourfacewithvariousdegreesofterriblenes