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 が必要であることがわかりました。