汇编程序在调用printf后崩溃

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (27)

我正在编写一个简单的函数来从堆栈中打印浮点值。生成此函数,因此未进行优化。程序在printf调用时崩溃。

;input: float32 as dword ptr ebp+8
printfloat32:
 push   ebp
  mov   ebp,    esp
  sub   esp,    16
;local ptr variable k at dword ptr ebp-4
  mov   dword ptr ebp-4,    lpcstr4 ;which is "%f"

movss       xmm0,           dword ptr ebp+8
cvtss2sd    xmm0,           xmm0
  sub       esp,            8
movsd       qword ptr esp,  xmm0
 push       dword ptr ebp-4
 call       printstr
  add       esp,            12

  mov   esp,    ebp
  pop   ebp
  ret

printstr是printf。这是完整生成的代码:https//pastebin.com/g0Wff0JY

提问于
用户回答回答于

推ebp后,[ebp] =保存ebp,[epb-4] =返回地址,[ebp + 8] =第一个参数。由于sub esp,16用于在堆栈上分配空间,因此[ebp + 0到[ebp + 15]可用于本地存储或作为被调用函数的参数。使用masm语法:

        mov     dword ptr [ebp-4],offset lpcstr4   ;overwrites return address

相反,调用序列可以是:

        movsd   qword ptr [ebp+ 8],xmm0
        mov     dword ptr [ebp+12],offset lpcstr4
        call    printstr    ; why not printf?
        mov     esp,ebp

扫码关注云+社区

领取腾讯云代金券