汇编循环循环太多次
Assembly loops loop too many times
我是汇编的新手(昨天开始学习)并且循环有问题:
下面的代码 应该 打印值 0-49,但它打印 0-49,然后是 ~20 行垃圾(我假设这是程序的其他 programs/other 位正在使用的堆栈)。我预计问题出在第二个循环 .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";^^^
提前致谢。
p.s。如何使用语法高亮格式化代码?
问题是 cinvoke printf,formatstring,eax
更改了 ECX
寄存器,正如 zx485 所指出的。事实证明它也改变了 EDX
寄存器。
为了修复它,我改为使用 EBX
寄存器,它 不是 由 cinvoke printf,formatstring,eax
修改的。
我希望这对某人有所帮助。
编辑:melpomene 发布了一个更好的答案。
ecx
是 "caller-saved" 寄存器之一,这意味着任何函数调用都可以修改 ecx
并且在必要时 save/restore 它是调用者的工作。
According to the Intel ABI to which the vast majority of compilers conform, the EAX, EDX, and ECX are to be free for use within a procedure or function, and need not be preserved.
您在循环中对 printf
的调用可能会破坏 ecx
。
我是汇编的新手(昨天开始学习)并且循环有问题:
下面的代码 应该 打印值 0-49,但它打印 0-49,然后是 ~20 行垃圾(我假设这是程序的其他 programs/other 位正在使用的堆栈)。我预计问题出在第二个循环 .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";^^^
提前致谢。
p.s。如何使用语法高亮格式化代码?
问题是 cinvoke printf,formatstring,eax
更改了 ECX
寄存器,正如 zx485 所指出的。事实证明它也改变了 EDX
寄存器。
为了修复它,我改为使用 EBX
寄存器,它 不是 由 cinvoke printf,formatstring,eax
修改的。
我希望这对某人有所帮助。
编辑:melpomene 发布了一个更好的答案。
ecx
是 "caller-saved" 寄存器之一,这意味着任何函数调用都可以修改 ecx
并且在必要时 save/restore 它是调用者的工作。
According to the Intel ABI to which the vast majority of compilers conform, the EAX, EDX, and ECX are to be free for use within a procedure or function, and need not be preserved.
您在循环中对 printf
的调用可能会破坏 ecx
。