首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >程序集循环循环次数过多

程序集循环循环次数过多
EN

Stack Overflow用户
提问于 2018-06-09 04:59:00
回答 1查看 187关注 0票数 1

我对汇编非常陌生(昨天开始学习),在循环方面有问题:

下面的代码应该打印0-49的值,但它打印的是0-49和~20行垃圾(我假设这是其他程序/程序的其他部分正在使用的堆栈的一部分)。我认为问题出在第二个循环.loop中,因为它打印的行数不正确,并且打印是由.loop处理的。

我正在使用FASM (平面汇编程序)程序来编译这段代码。

代码:

代码语言:javascript
复制
format PE console
include "win32ax.inc"
start:
    mov ecx, 50 ;number of loops
    .mainloop: ;for testing purposes, just pushes 49-0 onto the stack
        push ecx ;push onto stack
        dec ecx ;decrement counter
        jnz .mainloop ;jump if counter not zero

    mov ecx, 50 ;reset ecx (counter)
    .loop: ;prints the stack, should print 0-49 but also prints garbage at the end
        pop eax ;pop from stack to eax
        cinvoke printf,formatstring,eax ;print eax
        dec ecx ;decrement counter
        jnz .loop ;loop if counter not zero
    int 15;wait 5 seconds ish
    invoke ExitProcess ;exit

formatstring    db "%d",13,10,0 ;to print digits instead of ASCII chars

section '.idata' import data readable ;stuff I copied but seems to work
    library msvcrt,'msvcrt.dll',\ ;don't understand it
        kernel32,'kernel32.dll'   ;^
    import  msvcrt,printf,'printf';^^
    import  kernel32,ExitProcess,"ExitProcess";^^^

提前谢谢。

附注:如何使用语法突出显示格式化代码?

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 05:08:38

正如zx485所指出的,问题在于cinvoke printf,formatstring,eax更改了ECX寄存器。事实证明,它还会更改EDX寄存器。

为了解决这个问题,我改为使用cinvoke printf,formatstring,eax没有修改的EBX寄存器。

我希望这对某些人有帮助。

编辑: melpomene发布了一个更好的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档