【发布时间】:2018-06-08 20:59:00
【问题描述】:
我对组装非常陌生(昨天开始学习)并且有循环问题:
下面的代码应该打印值 0-49,而是打印 0-49,然后是大约 20 行垃圾(我假设这是其他程序/程序的其他部分正在使用)。我预计问题出在第二个循环.loop,因为它打印的行数错误,并且打印由.loop 处理。
我正在使用 FASM (Flat Assembler) 程序来编译它。
代码:
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";^^^
提前致谢。
附言如何使用语法高亮格式化代码?
【问题讨论】:
-
可能
cinvoke printf,formatstring,eax ;print eax确实更改了ECX寄存器,因为它被操作系统视为易失性。 -
我会调查的
-
是的,你的权利。谢谢!