为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
继续给我一个分段错误错误。
让我们看看......当我调用函数时,堆栈应如下所示:
然后我推EBP
:
我希望EBP
包含堆栈基地的地址,所以我这样做:
mov EBP, ESP
所以基本上EBP
现在是堆栈基地的地址。由于ECX
需要是我打算打印的地址,ECX
应该是EBP
(堆栈基地址)移动8个字节,以便它指向5
我想要打印:
mov ECX,[EBP + 8]
要打印它我首先将其转换为ASCII:
add byte [ECX],'0'
我在这里看不到问题。为什么我会出现分段错误?
答案 0 :(得分:3)
mov ECX,[EPB+8]
将位置EPB+8
的值移至ECX
,这不是有效地址。它只是5
。你可以这么做:
mov ECX,EPB
add ECX,8