我想知道从程序的入口点返回ret是否合法。NASM的示例:section.textglobal_start_start:ret;Linux:nasm-felf64foo.asm-ofoo.o&&ldfoo.o;OSX:nasm-fmacho64foo.asm-ofoo.o&&ldfoo.o-lc-macosx_version_min10.12.0-e_start-ofooret从堆栈中弹出返回地址并跳转到该地址。但是堆栈的最高字节是在程序入口处的有效返回地址,还是我必须调用exit?另外,上面的程序在OSX上不存在段错误。返回到哪里? 最佳答案
我正在尝试将CMU的二进制炸弹作为一个独立项目来学习一些x86汇编和逆向工程。(它不是与类(class)相关的自动评分版本。)我从http://csapp.cs.cmu.edu/public/labs.html下载了bomb.tar.来自CMU的实验室描述:A"binarybomb"isaprogramprovidedtostudentsasanobjectcodefile.Whenrun,itpromptstheusertotypein6differentstrings.Ifanyoftheseisincorrect,thebomb"explodes,"printinganerror
我正在尝试将CMU的二进制炸弹作为一个独立项目来学习一些x86汇编和逆向工程。(它不是与类(class)相关的自动评分版本。)我从http://csapp.cs.cmu.edu/public/labs.html下载了bomb.tar.来自CMU的实验室描述:A"binarybomb"isaprogramprovidedtostudentsasanobjectcodefile.Whenrun,itpromptstheusertotypein6differentstrings.Ifanyoftheseisincorrect,thebomb"explodes,"printinganerror
提出这个问题是因为作者正在构建一个编译器(src->asm)并且正在编写生成汇编代码的代码。当程序在基于Linux(实际上是任何操作系统)的操作系统上执行时,首先发生的事情之一是设置堆栈并为SP寄存器分配堆栈开头的内存地址。我很好奇执行上述操作的责任是程序还是操作系统本身。如果责任在于程序,那么程序是如何完成的(具体来说,在Linux基础环境中)?在开始执行其主要功能之前,单个程序还必须执行哪些其他操作?带有注释的i386NASM汇编代码的示例表示赞赏。此外,任何可以帮助作者实现其目标的网络资源也将不胜感激。 最佳答案 你可以去搜索
提出这个问题是因为作者正在构建一个编译器(src->asm)并且正在编写生成汇编代码的代码。当程序在基于Linux(实际上是任何操作系统)的操作系统上执行时,首先发生的事情之一是设置堆栈并为SP寄存器分配堆栈开头的内存地址。我很好奇执行上述操作的责任是程序还是操作系统本身。如果责任在于程序,那么程序是如何完成的(具体来说,在Linux基础环境中)?在开始执行其主要功能之前,单个程序还必须执行哪些其他操作?带有注释的i386NASM汇编代码的示例表示赞赏。此外,任何可以帮助作者实现其目标的网络资源也将不胜感激。 最佳答案 你可以去搜索
我不确定我是否发现了g++(4.4.1-4ubuntu9)中的错误,或者我是否正在做有事吗。我相信我看到的是通过启用引入的错误使用g++-O2进行优化。我试图将代码提炼为相关部分。启用优化后,我有一个失败的ASSERT。什么时候禁用优化,相同的ASSERT不会失败。我想我已经追踪归结为对一个函数及其调用者的优化。系统语言:C++Ubuntu9.10g++-4.4.real(Ubuntu4.4.1-4ubuntu9)4.4.1Linux2.6.31-22-serverx86_64启用优化编译对象:g++-DHAVE_CONFIG_H-I。-fPIC-g-O2-MTfile.o-MD-MP
我不确定我是否发现了g++(4.4.1-4ubuntu9)中的错误,或者我是否正在做有事吗。我相信我看到的是通过启用引入的错误使用g++-O2进行优化。我试图将代码提炼为相关部分。启用优化后,我有一个失败的ASSERT。什么时候禁用优化,相同的ASSERT不会失败。我想我已经追踪归结为对一个函数及其调用者的优化。系统语言:C++Ubuntu9.10g++-4.4.real(Ubuntu4.4.1-4ubuntu9)4.4.1Linux2.6.31-22-serverx86_64启用优化编译对象:g++-DHAVE_CONFIG_H-I。-fPIC-g-O2-MTfile.o-MD-MP
有这段代码:intmain(){intx=13;gotof;asm__volatile__(".byte0xff");f:return0;}我不明白为什么g++优化它并且不包括操作码(在反汇编中):#5"q.c"1.byte0xff#0""2即使我在没有任何优化的情况下进行编译:g++-g-O0-Sq.c。我尝试单独使用g++-g和g++-O0因为我读到它在某些情况下可能不兼容。如果我注释gotof;行,它将插入操作码。.file"q.c".text.globlmain.typemain,@functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_d
有这段代码:intmain(){intx=13;gotof;asm__volatile__(".byte0xff");f:return0;}我不明白为什么g++优化它并且不包括操作码(在反汇编中):#5"q.c"1.byte0xff#0""2即使我在没有任何优化的情况下进行编译:g++-g-O0-Sq.c。我尝试单独使用g++-g和g++-O0因为我读到它在某些情况下可能不兼容。如果我注释gotof;行,它将插入操作码。.file"q.c".text.globlmain.typemain,@functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_d
我正在尝试跟进thisthread不幸的是,这并不能完全解决我的问题。我尝试运行的代码如下:;Filehello.asmsection.datamsg:db"HelloWorld!",0x0a,0section.textglobalmainexternprintfmain:pushrbpmovrbp,rspleardi,[msg];parameter1forprintfxoreax,eax;0floatingpointparametercallprintfxoreax,eax;returns0poprbpret我的系统是debianstretch:$uname-aLinux4.8.0-