1

x86_64 Linux アセンブラーでの printf の呼び出しの書き込みに問題があります。のときに double 値を出力しようとrsp % 0x10 != 0すると、segfault で 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, ...すべてが良ければ。コード作業。しかし、別の値のコードでは、segfault でダウンしています。なんで?

私はこれをコンパイルしてリンクします:

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