gpt4 book ai didi

c - 汇编程序在调用 printf 后崩溃

转载 作者:行者123 更新时间:2023-11-30 14:40:25 25 4
gpt4 key购买 nike

我正在编写一个简单的函数来从堆栈中打印浮点值。这个函数是生成的,所以没有优化。程序在 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

最佳答案

查看图像,我发现可能存在潜在问题,但我不知道 fasm 语法:

        call    [printstr]     ;syntax used for the first call
...
call printstr ;syntax used for the second call that fails

如果 printstr 是指向函数的基于内存的指针,则第二个调用语法可能会尝试调用存储指针的位置,而不是通过使用内存中的值作为函数指针来调用实际函数.

在最新版本的 Visual Studio 中,默认的 printf 和 scanf 已有效内联到 C/C++ 代码中,语法相当复杂。除了处理这个问题之外,还有一些可调用的旧版本需要此 includelib 语句:

        includelib      legacy_stdio_definitions.lib    ;for scanf, printf, ...

我将代码从问题转换为 masm 语法,将 printstr 更改为 printf 并在 Windows 7 Pro 64 位上使用 Visual Studio 2015 测试了 32 位构建(构建是 32 位,因此在 32 位模式下运行)。我对这段代码没有任何问题。我使用调试器单步调试代码,没有发现堆栈中存储内容的任何问题。我怀疑问题出在第二次调用不带括号的 printstr 上,我在转换为 masm 语法时更正了该问题。

        .data
varf real4 123.75
lpcstr4 db "%f",00ah,0 ;added new line
.code
extern printf:near ;instead of printstr

printfloat32 proc
push ebp
mov ebp,esp
sub esp,16
mov dword ptr [ebp-4], offset lpcstr4
movss xmm0,dword ptr [ebp+8]
cvtss2sd xmm0,xmm0
sub esp,8
movsd qword ptr [esp],xmm0
push dword ptr [ebp-4]
call printf ;was printstr
add esp,12
mov esp,ebp
pop ebp
ret
printfloat32 endp

main proc
push varf ;test printfloat32 function
call printfloat32
add esp,4
xor eax,eax
ret
main endp
end
<小时/>

使用 printstr 作为指向 printf 的指针。 Masm 不需要括号,因为它知道 printstr 是 dd(指向 printf 的指针)。

        .code
extern printf:near
printstr dd printf ;masm doesn't need brackets

printfloat32 proc
; ...
call printstr ;masm doesn't need brackets
; ...
printfloat32 endp

如果 printstr 在此源文件外部,则 masm 语法将为

        extrn   printstr:ptr    ; or extern   printstr:dword

关于c - 汇编程序在调用 printf 后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55564584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com