我有一个用于NASM(ArchLinuxi686)的以下程序SECTION.dataLC1:db"librarycall",0SECTION.textexternexitexternprintf;globalmain;main:global_start_start:pushLC1callprintfpush0callexit用命令组装:nasm-felflibcall.asm如果用_start注释两行,用main取消注释两行,然后用命令进行汇编和链接:gcclibcall.o-olibcall然后程序运行OK。但是,如果使用_start入口点组装代码并使用命令链接:ldlibcall.
如果我在WindowsVC++中有如下代码:DWORDsomevar=0x12345678;_asmcalldwordptr[somevar]如何使用AT&T语法在GCC内联汇编中做同样的事情?__asm____volatile__("calldwordptr[%%edx]"::"d"(somevar));我试过类似的方法,但它会生成“垃圾”错误...然后我尝试将somevar传递给一些寄存器,然后将其转换为dword、ptr等,但我做不到不要让它工作。更新:我发现了一些有用的东西,好像在那种情况下我们必须使用圆括号而不是方括号,我发现了一些带有lcall的东西调用far。但我仍然不明
如果我在WindowsVC++中有如下代码:DWORDsomevar=0x12345678;_asmcalldwordptr[somevar]如何使用AT&T语法在GCC内联汇编中做同样的事情?__asm____volatile__("calldwordptr[%%edx]"::"d"(somevar));我试过类似的方法,但它会生成“垃圾”错误...然后我尝试将somevar传递给一些寄存器,然后将其转换为dword、ptr等,但我做不到不要让它工作。更新:我发现了一些有用的东西,好像在那种情况下我们必须使用圆括号而不是方括号,我发现了一些带有lcall的东西调用far。但我仍然不明
源代码:1intfunc()2{3inta=0x12345678;4int*p=&a;5return*p;6}8intmain()9{10intb=0x87654321;11returnb+func();12}反汇编:(gdb)disassmainDumpofassemblercodeforfunctionmain():0x0000000000400544:push%rbp0x0000000000400545:mov%rsp,%rbp0x0000000000400548:sub$0x10,%rsp0x000000000040054c:movl$0x87654321,-0x4(%rbp)
源代码:1intfunc()2{3inta=0x12345678;4int*p=&a;5return*p;6}8intmain()9{10intb=0x87654321;11returnb+func();12}反汇编:(gdb)disassmainDumpofassemblercodeforfunctionmain():0x0000000000400544:push%rbp0x0000000000400545:mov%rsp,%rbp0x0000000000400548:sub$0x10,%rsp0x000000000040054c:movl$0x87654321,-0x4(%rbp)
这个问题在这里已经有了答案:Linuxx64:whydoesr10comebeforer8andr9insyscalls?(2个答案)关闭3年前。根据SystemVX86-64ABI,应用程序中的函数调用使用以下寄存器序列来传递整数参数:rdi,rsi,rdx,rcx,r8,r9但是系统调用参数(系统调用号除外)在另一个寄存器序列中传递:rdi,rsi,rdx,r10,r8,r9为什么内核使用r10而不是rcx作为第四个参数?它是否与rcx未保留而r10保留这一事实有某种关系?
这个问题在这里已经有了答案:Linuxx64:whydoesr10comebeforer8andr9insyscalls?(2个答案)关闭3年前。根据SystemVX86-64ABI,应用程序中的函数调用使用以下寄存器序列来传递整数参数:rdi,rsi,rdx,rcx,r8,r9但是系统调用参数(系统调用号除外)在另一个寄存器序列中传递:rdi,rsi,rdx,r10,r8,r9为什么内核使用r10而不是rcx作为第四个参数?它是否与rcx未保留而r10保留这一事实有某种关系?
moveax,0x01movecx,0x02divecx;DivideAX/CX,savesremainderinDXcmpdx,0jeOddNumberint80h当我尝试除以1/2时,它没有标记OddNumber,而是返回“float异常”。我知道1/2是一个float,但我该如何处理呢?谢谢。GDB显示“程序收到信号SIGFPE,算术异常。”顺便说一下。 最佳答案 在调用divecx之前,您需要将edx清零。当使用32位除数(例如,ecx)时,div将edx:eax中的64位值除以其参数,因此如果edx中有垃圾,它会被视为股息
moveax,0x01movecx,0x02divecx;DivideAX/CX,savesremainderinDXcmpdx,0jeOddNumberint80h当我尝试除以1/2时,它没有标记OddNumber,而是返回“float异常”。我知道1/2是一个float,但我该如何处理呢?谢谢。GDB显示“程序收到信号SIGFPE,算术异常。”顺便说一下。 最佳答案 在调用divecx之前,您需要将edx清零。当使用32位除数(例如,ecx)时,div将edx:eax中的64位值除以其参数,因此如果edx中有垃圾,它会被视为股息
我想知道从程序的入口点返回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上不存在段错误。返回到哪里? 最佳答案