【发布时间】:2013-10-12 04:08:21
【问题描述】:
学习 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
我希望EBP 包含堆栈基址的地址,所以我这样做:
mov EBP, ESP
所以基本上EBP 现在是堆栈基址的地址。由于ECX 需要是我要打印的任何地址,ECX 应该是EBP(堆栈的基地址)移动了 8 个字节,以便它指向我想要的5打印:
mov ECX,[EBP + 8]
为了打印它,我先将其转换为 ASCII:
add byte [ECX],'0'
我看不到这里的问题。为什么会出现分段错误?
【问题讨论】:
-
+1 我整天看到的第一个写得很好的问题 :-)
标签: linux ubuntu assembly nasm 32-bit