【发布时间】:2020-06-07 12:58:00
【问题描述】:
我正试图在组装中打印双打,但我失败了。我在调用我自己的函数时遇到了段错误,我打算将其用作帮助器来打印双精度以进行调试。我正在关注这些printf 示例:https://www.csee.umbc.edu/portal/help/nasm/sample.shtml
我的代码目前如下所示:
section .data
formatStrf: db `The number is %f\n`,0
section .text
extern printf
printfcallfloat:
;Pass in RDI
PUSH RDI ;Preserve value of rdi
PUSH RAX ;Preserve value of RAX
PUSH RDI;The value we want to print
PUSH DWORD formatStrf
CALL printf ;Segfault
POP RAX;Pop the stack back (too lazy to manually change the RSP value)
POP RAX
POP RAX;Restore the RAX and RDI
POP RDI
RET
我将浮点值传递给RDI reg,如下所示:
MOVSD QWORD [RSP], XMM0 ;Copy to stack
MOV RDI, QWORD [RSP]
CALL printfcallfloat
编辑:我在 linux 上运行它。
【问题讨论】:
-
@prl 是的,我确实在 linux 上运行它。也将该信息添加到问题中。
-
您链接的页面有 32 位示例,您似乎已经通过简单的方式将其转换为 64 位,但这不起作用,因为调用约定完全不同。该页面上有 64 位示例的链接;你应该关注那些。
标签: assembly segmentation-fault printf x86-64