当我尝试使用 brk (int 0x80 with 45 in %rax) 在汇编中实现一个简单的内存管理器程序并按顺序打印块时,我一直遇到段错误。过了一会儿,我只能重现错误,但不知道为什么会这样:
.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
在此处的示例中,如果注释行未注释,则我有段错误,但某些命令(如 de movq $0, %rax)工作正常。在我的另一个程序中,前几个 printf 工作,但第三个崩溃...寻找其他问题,我听说 printf 有时会分配一些内存,并且不应该使用 brk,因为在这种情况下它会破坏堆或者什么...我很困惑,有人知道吗?
编辑:我刚刚发现要让 printf 工作,你需要 %rax=0。