比如说,我想在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
我想学习PowerPC和ARM的汇编程序编程,但我无法为此购买真正的硬件。我正在考虑为此使用QEMU。但是我不确定它是否足够好地模拟这两种架构,我是否会在其上使用native汇编程序编译和运行我的程序? 最佳答案 QEMU可以很好地测试程序校正(即代码是否可以在实际的ARM或PowerPC上正确运行)但它不适用于测试程序效率:仿真不是周期精确的,并且使用QEMU测量的速度不能可靠地(甚至不可靠地)与真实硬件上的速度相关联。此外,QEMU不会捕获未对齐的内存访问,这对于PowerPC仿真不是问题(PowerPC容忍未对齐的访问)但可能
在零售构建中分析核心转储通常需要关联任何特定模块的objdump和源代码。如果函数非常复杂,通常将程序集转储与源代码关联起来会很痛苦。今天,我尝试创建一个特定模块的程序集列表(使用编译选项-S),希望我会看到一个带有程序集或某种相关性的交错源代码。不幸的是,该列表不够友好,无法关联,所以我想知道给定一个核心转储,我可以从中确定崩溃位置objdump通过重新编译失败的模块汇编列表带有-S选项的模块。是否可以与源做一一对应?例如,我将程序集列表视为.LBE7923:.loc248630movq%rdi,%r14movl%esi,%r12dmovl696(%rsp),%r15dmovq704
我正在学习AT&Tx86汇编语言。我正在尝试编写一个接受整数n的汇编程序,然后返回结果(n/2+n/3+n/4)。这是我所做的:.text.global_start_start:pushl$24callprofitmovl%eax,%ebxmovl$1,%eaxint$0x80profit:popl%ebxpopl%eaxmov$0,%esimovl$4,%ebpdiv%ebpaddl%eax,%esimovl%ecx,%eaxmovl$3,%ebpdiv%ebpaddl%eax,%esimovl%ecx,%eaxmovl$2,%ebpdiv%ebpaddl%eax,%esimovl%
我正在尝试在Intel架构的Linux汇编中编译一个小程序。我想使用C库的一些函数,但它没有链接。这是我的汇编程序:.text.globlmainmain:pushl$512callmallocaddl$4,%espmov$1,%eaxmov$0,%ebxint$0x80我正在编译as--32-ooutput.ooutput.asm在这里,一切顺利。然后当我链接到ld-static-melf_i386-oa.outoutput.o-lc,我遇到了这些错误:(.text+0x1b8):undefinedreferenceto_Unwind_Resume'/usr/lib32/libc.a
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正在寻找的是一个将在Linux上运行的IDE,它支持C++和x86汇编语法突出显示。我已经尝试过Code::Blocks,但它不允许我按需要运行该程序,因此效果不佳。我的需求:能够通过在某个目录下发出“makeall”来编译程序能够通过发出自定义命令而不是运行某个可执行文件来运行程序图形化(不是vim/emacs/等),将在GNOME/Fedora14中运行什么会很
我觉得我的问题可能看起来有点奇怪,但就是这样;我正在尝试用C++动态创建一个程序(主要是为了它的乐趣,但也出于编程原因)并且它并不像听起来那么难。为此,您必须像这样在运行时使用程序集:byte*buffer=newbyte[5];*buffer='0xE9';//Codefor'jmp'*(uint*)(buffer+1)='addressdestination';//Addresstojumpto这比看起来容易得多,因为我只针对一个平台和编译器;GCC与Linux32位(并且只有一个调用约定,cdecl)。所以我试图创建一个动态汇编函数来重定向来自触发器的调用,这样我就可以使用类方法
我有两个宏,一个是用汇编写的,另一个是用C写的。第二个宏使用了第一个宏。但是,我还想用volatile在汇编中编写第二个宏,这样我就可以控制它在代码中的位置。请注意,tid是一个运行时值,而不是像n这样的常量。用汇编编写它的好方法是什么?此外,是否可以控制C代码的放置,例如使用volatile的汇编?#defineSAVE_SP(n)__asm____volatile__("movq%rsp,msp"#n";"\"movqts"#n",%rsp;"\)#defineSAVE_STACK_POINTER(tid)\switch(tid)\{\case0:\SAVE_SP(0);\brea
我正在尝试运行的代码如下。我使用nasmutil将其转换为目标文件。当我尝试执行时,它说“无法执行二进制文件”。我运行命令:nasm-felf-ohelloworld.ohelloworld.asmsegment.datamsgdb"Hello,world!",10lenequ$-msgsegment.textglobal_start_start:moveax,4movebx,1movecx,msgmovedx,lenint80hmoveax,1movebx,0int80h这是我在汇编中的第一个程序,除了编译一些我没有使用ubuntu基本的C程序。我需要一些帮助谢谢大家。