gpt4 book ai didi

linux - 使用 NASM Assembly 在堆栈中打印数字

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:52 25 4
gpt4 key购买 nike

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

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

最佳答案

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

mov   ECX,EPB
add ECX,8

关于linux - 使用 NASM Assembly 在堆栈中打印数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com