1

学习 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'

我看不到这里的问题。为什么会出现分段错误?

4

1 回答 1

3

mov ECX,[EPB+8]将 location 处的值移动EPB+8ECX,这不是一个有效的地址。只是5。你可以这样做:

mov   ECX,EPB
add   ECX,8
于 2013-10-05T03:37:39.090 回答