使用NASM Assembly打印堆栈中的数字

时间:2013-10-05 02:45:37

标签: linux ubuntu assembly nasm 32-bit

为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 个答案:

答案 0 :(得分:3)

mov ECX,[EPB+8]将位置EPB+8的值移至ECX,这不是有效地址。它只是5。你可以这么做:

mov   ECX,EPB
add   ECX,8