我在一个文件中的asm中编写了一个简单的基本交换功能。在另一个文件中,我编写了一个“所谓的”主程序来测试我的交换功能。但是,一旦调用该函数,就会发生分段错误。我不知道为什么会这样。
global swap
;given two addresses of stack variables (rdi, rsi) swaps the content of the two
;variables
swap:
enter 0, 0
mov rax, [rdi] ;save of var1
mov rdx, [rsi] ;save of var2
mov rdi, rbx
mov rsi, rax
leave
ret
该函数接收两个堆栈变量的地址,以在rdi和rsi中交换;这是测试功能的代码:
global _start
extern swap
section .text
_start:
enter 16, 0
mov qword [rbp], 0xFF
mov qword [rbp+8], 0x11
mov rdi, [rbp]
mov rsi, [rbp+8]
call swap ;swap causes seg fault?? ------------------
cmp qword [rbp], 0xFF
jz FAIL
cmp qword [rbp+8], 0x11
jz FAIL
cmp qword [rbp], 0x11
jnz FAIL
cmp qword [rbp+8], 0xFF
jnz FAIL
;else success
mov rax, 60
xor rdi, rdi
syscall
FAIL:
mov rax, 60
mov rdi, -1
syscall
当我调用交换函数时发生分段错误。我怀疑这与访问主程序的堆栈有关,但是我不知道该怎么做。 我也有一个make文件,可以将文件编译和链接在一起(据我所知,那里没有问题)