gpt4 book ai didi

loops - x86 程序集 : Loops!

转载 作者:行者123 更新时间:2023-12-01 09:21:16 30 4
gpt4 key购买 nike

好吧,长话短说,我正在学习汇编,我正在尝试循环打印出 ascii 字符“0”-“9”。因此,我完成了我在示例中看到的所有基础知识,例如使用 pushad 和 popad 保存寄存器状态,分配堆栈空间,并确保我让事情保持原样。所以我管理了这个小例子:

;
; Hello_World.asm
; (NASM Syntax, Windows)

extern _printf

section .text

_main:
pushad ; save register states

push ebp ; save old stack
mov ebp, esp ; prepare new stack
sub esp, 1*4 ; allocate 4 bytes

mov byte [esp + 0], 48 ; add ascii '0' to stack
mov byte [esp + 1], 0 ; add ascii NULL terminator to stack

push esp; ; push the string in the stacks refrence
call _printf ; call printf()
add esp, 4 ; pop string refrence

add esp, 1*4 ; deallocate 4 bytes
mov esp, ebp ; close this stack
pop ebp ; restore old stack

popad ; restore register states
ret ; leave this function

这行得通,它打印出“0”,但这有点安全。我试着在其中添加一个循环,但事情就在那里分崩离析。我读到“循环”操作码应该递减 ECX 寄存器,并在 ECX > 0 时返回到标签参数,但是,我认为我还没有完全理解它。

所以我添加了几行,然后想出了这个:

;
; Hello_World.asm
;

extern _printf
global _main

section .text

_main:
pushad ; save register states

push ebp ; save old stack
mov ebp, esp ; prepare new stack
sub esp, 1*4 ; allocate 4 bytes

mov byte [esp + 0], 48 ; add ascii '0' to stack
mov byte [esp + 1], 0 ; add ascii NULL terminator to stack

mov ecx, 9 ; set loop counter to 9

aLoop:
inc byte [esp + 0] ; increment ascii character
push esp; ; push the string in the stacks refrence
call _printf ; call printf()
add esp, 4 ; pop string refrence
loop aLoop ; loop back to aLoop if ecx > 0

add esp, 1*4 ; deallocate 4 bytes
mov esp, ebp ; close this stack
pop ebp ; restore old stack

popad ; restore register states
ret ; leave this function

好吧,现在事情变得疯狂了。我在命令提示符下运行它,我通过耳机听到哔哔声,它循环遍历每个 ascii 字符,将它们全部打印出来。因此,在大约 5 秒的飞行角色之后,我假设有什么东西溢出了,它就崩溃了。

我对汇编还很陌生(今天是我真正编码的第一天),我看不出哪里出了问题。有人可以解释一下如何更好地实现循环吗?

提前致谢!-杰森

最佳答案

“_printf”子例程是否保留 ECX 的内容?如果没有,那可能是你的问题。尝试在通话过程中保存它。

关于loops - x86 程序集 : Loops!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6025648/

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