【问题标题】:Printing a number in the stack with NASM Assembly使用 NASM 组件在堆栈中打印一个数字
【发布时间】: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


【解决方案1】:

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

mov   ECX,EPB
add   ECX,8

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2015-09-17
    • 2016-01-07
    • 1970-01-01
    • 2015-04-12
    • 2020-03-29
    • 1970-01-01
    • 2018-03-26
    • 2014-09-16
    相关资源
    最近更新 更多