我对汇编非常陌生(昨天开始学习),在循环方面有问题:
下面的代码应该打印0-49的值,但它打印的是0-49和~20行垃圾(我假设这是其他程序/程序的其他部分正在使用的堆栈的一部分)。我认为问题出在第二个循环.loop
中,因为它打印的行数不正确,并且打印是由.loop
处理的。
我正在使用FASM (平面汇编程序)程序来编译这段代码。
代码:
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";^^^
提前谢谢。
附注:如何使用语法突出显示格式化代码?
发布于 2018-06-09 05:08:38
正如zx485所指出的,问题在于cinvoke printf,formatstring,eax
更改了ECX
寄存器。事实证明,它还会更改EDX
寄存器。
为了解决这个问题,我改为使用cinvoke printf,formatstring,eax
没有修改的EBX
寄存器。
我希望这对某些人有帮助。
编辑: melpomene发布了一个更好的答案。
https://stackoverflow.com/questions/50768326
复制相似问题