学习 32 位 Ubuntu 的 NASM 汇编。
执行一个函数,在调用它之前简单地打印你压入堆栈的数字:
SECTION .text
global main
main:
; -----------------------------------------------------------
; Main
; -----------------------------------------------------------
push 5
call print_number
; -----------------------------------------------------------
; Exit
; -----------------------------------------------------------
mov EAX,1
int 0x80
; -----------------------------------------------------------
; Prints a number
; -----------------------------------------------------------
print_number:
push EBP
mov EBP,ESP
mov EAX,4
mov EBX,0
mov ECX,[EBP + 8]
add byte [ECX],'0'
mov EDX,1
int 0x80
pop EBP
ret
不断给我一个分段错误错误。
让我们看看......当我调用函数时,堆栈应该是这样的:
- 5
- 退货地址
然后我推EBP
:
- 5
- 退货地址
- 血压
我想EBP
包含堆栈基址的地址,所以我这样做:
mov EBP, ESP
所以基本上EBP
现在是堆栈基址的地址。由于ECX
需要是我要打印的任何内容的地址,ECX
因此应该EBP
(堆栈基址的地址)移动 8 个字节,以便它指向5
我要打印的内容:
mov ECX,[EBP + 8]
为了打印它,我首先将它转换为 ASCII:
add byte [ECX],'0'
我看不到这里的问题。为什么会出现分段错误?