我正在Linux内核中调试一个不相关的问题,看到了etcd由supervisor管理的进程反复出现页面错误异常并接收SIGSEGV。我很好奇并使用objdump反汇编程序,发现错误的amd64指令是:89042500000000mov%eax,0x0然后我查看了一个helloworld程序的反汇编。我在go编译器生成的代码中看到了一个非常常见的模式,即在一个函数的末尾,紧接在ret之后,有一个mov后面跟着一个jmp回到函数中。例如,0000000000400c00:400c00:64488b0c25f0ffmov%fs:0xfffffffffffffff0,%rcx400c07:ff
例如://dummy.gotypedummystruct{puintptr}func(ddummy)Get(iint)uint64//func(d*dummy)Get(iint)uint64//nowaytodefine*dummyinassemblyfunc(ddummy)Get可以定义为://dummy_amd64.s#include"textflag.h"TEXT·dummy·Get(SB),NOSPLIT,$0MOVQ$42,24(SP)RET我试过了TEXT"".(*dummy).Get+0(SB),4,$0-24//outputfrom6g-STEXT""·(*dummy)
我一直在尝试在Go中使用汇编语言,并且编写了一个HammingWeight用作练习。我在thisSOanswer上创建了一个原生的Go版本汇编版本基于thisdocfromAMD(page180).在对这两个函数进行基准测试后,我发现原生Go版本比汇编版本快1.5到2倍,尽管手写汇编版本与gotool6g-Spopcount.go的输出几乎相同。gotest-bench=.的输出PASSBenchmarkPopCount10000000019.4ns/opBenchmarkPopCount_g2000000008.97ns/opokpopcount4.777spopcount.gopa
这是我的第一个问题,希望我没有做错。我的问题是我有一个旧的DOS程序,它对文件格式进行了相当多的修改以节省空间。(是的,对于那些知道的人来说,这是一个演示场景。)Objdump不想帮助我;快速谷歌搜索没有针对该问题产生任何实际结果,联机帮助页在这方面似乎也不太慷慨。是的,还有其他的,比如lida。但是,出于某种原因,我无法让lida工作;我相信还有其他选择。有人有在Linux上反汇编DOS可执行文件的经验吗?或者我应该尝试一些基于DOS的反汇编程序并在Dosemu上运行它? 最佳答案 IDA是最好的反汇编器,而且还有linux版。它
我遇到过用我编写的汇编语言为程序构建Makefile的任务(没什么特别的,就像一个helloworld)。该程序在Linux32位中,我正在使用NASM汇编程序。到目前为止,我只能找到C程序的Makefile,我知道它们之间没有太大区别,但我对这件事不熟悉。我所拥有的是:Program:main.ogcc-oProgrammain.omain.o:main.asmnasm-felf-g-Fstabsmain.asm我不知道这是否正确,或者如果正确,它是如何工作的。我无法尝试代码,因为这台计算机没有Linux。我真的很想知道代码中发生了什么。 最佳答案
我开始学习汇编程序,并且在Unix中工作。我想打开一个文件并在上面写上“Helloworld”。section.datatextoutputdb'Helloworld!',10lentextequ$-textoutputfiletoopendb'hi.txt'section.textglobal_start_start:moveax,5;openmovebx,filetoopenmovecx,2;readandwritemodeint80hmoveax,4movebx,filetoopen;I'mnotsurewhatdoihavetoputhere,whatisthe"filedes
我正在阅读杰夫的精彩著作assemblystepbystep,我在第8章中展示了一个汇编程序示例,该程序以这种方式从用户那里获取文件:SECTION.bss;SectioncontaininguninitializeddataBUFFLENequ1024;LengthofbufferBuff:resbBUFFLEN;Textbufferitself它将文件文本读入Buff,并将该文本的一个版本全部大写输出到另一个文件。我想在Debug模式下运行这个程序来逐步分析所有寄存器发生了什么。我正在使用INSIGHT在ubuntu上运行它。我是一个完全的初学者。我知道如何使用Insight单步执
类似于HowdoIdisassemblerawx86code?,但是对于MIPS架构:如何使用objdump反汇编原始MIPS代码?我想查看vmlinux镜像中的说明,但现在我必须这样做::>x.cmipsel-linux-gnu-gcc-c-ox.ox.cmipsel-linux-gnu-objcopy--add-sectionraw=vmlinuxx.omipsel-linux-gnu-objcopy--remove-section.commentx.omipsel-linux-gnu-objdump-Dx.o|less有没有更简单的方法呢?我尝试了以下无济于事:mipsel-li
在汇编程序中,.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