brk (int 0x80 with 45 in %rax) を使用して、単純なメモリ マネージャー プログラムをアセンブリに実装し、ブロックを順番に出力しようとしているときに、segfault が発生し続けました。しばらくすると、エラーを再現することしかできませんでしたが、なぜこれが起こっているのかわかりません:
    .section    .data
    helloworld:
    .ascii  "hello world"
    .section    .text
    .globl      _start
_start:
    push    %rbp
    mov     %rsp, %rbp
    movq    $45, %rax  
    movq    $0, %rbx   #brk(0) should just return the current break of the programm
    int     $0x80
    #incq    %rax #segfault
    #addq    $1, %rax #segfault
    movq    $0, %rax #works fine?
    #addq    $1, %rax #segfault again?
    movq    $helloworld, %rdi
    call    printf
    movq    $1, %rax #exit
    int     $0x80
ここの例では、コメント行がコメント解除されている場合、segfault がありますが、一部のコマンド (de movq $0、%rax など) は問題なく動作します。私の他のプログラムでは、最初のいくつかの printf は機能しますが、3 つ目はクラッシュします... 他の質問を探していると、printf がメモリを割り当てることがあり、brk を使用すべきではないと聞きました。この場合、ヒープが破損するためです。または何か...私は非常に混乱しています、誰かそれについて何か知っていますか?
編集: printf を機能させるには %rax=0 が必要であることがわかりました。