1

我在 x86_64 linux 汇编器上调用 printf 时遇到问题。如果我尝试在 时打印一个双精度值rsp % 0x10 != 0,则 printf 会因段错误而下降。

查看我的代码(nasm 语法):

[bits 64]
global _start
extern printf
extern pow

section .data
    printf_format db '%lf', 10, 0
section .text
    _start:
    mov rbp, rsp
    sub rsp, MEM_VAL

    mov rax, 0x4000000000000000
    mov qword [rsp], rax

    movsd xmm0, qword [rsp]
    mov rdi, printf_format
    mov rax, 1
    call printf

    mov rax, 60
    mov rdi, 0
    syscall

如果MEM_VAL = 0x10, 0x20, ... , 0x100, ...一切都好。代码工作。但是另一个值代码因段错误而下降。为什么?

我编译并链接到这个:

nasm -f elf64 ex.asm
ld -lc -lm -m elf_x86_64 -I/lib/ld-linux-x86-64.so.2 ex.o -o ex

借此机会,我会问你,我可以在哪里阅读 x86_64 linux 中 C 调用约定的规范?我知道这是一个快速呼叫,但我无法理解这样的瘦弱。

4

0 回答 0