我正在学习x86汇编语言,并且试图编写一个程序,该程序从用户输入中读取数字n(2位数字)并迭代n次。
我尝试了很多方法,但是遇到了无限循环或段错误。
=IFERROR(ARRAYFORMULA((SUM(IFERROR(VLOOKUP(TRANSPOSE(C2:2),
'Data Validation'!C:D, 2, 0))/COUNTA(C2:2))*1)))
我想保存在ecx中,并将此数字重复n次
答案 0 :(得分:0)
对ecx
的调用使您的printf
寄存器被吹走了。
ecx
在某些调用约定中是易失性寄存器,很可能loop
中留下的内容破坏了您的printf
。
首先,我会在原始问题所附的评论中遵循Raymond的建议,并附加调试器以亲自见证这种行为。
关于解决方案,您可以尝试保留ecx
并在通话后恢复它,以查看区别:
; for example
mov edi,ecx
call printf
mov ecx,edi
这里可能会有更多问题(由于代码不完整而难以确定……但是诸如堆栈分配之类的东西似乎出于某种原因似乎很有趣)-但这是一个好地方开始。
Peter在我的回答下留下了评论,指出您可以通过完全不使用ecx
来循环解决问题并通过手动执行来优化我的解决方案,进行代码更改:
mov edi, eax
printNTimes:
push msgDig
call printf
add esp, 4
dec edi
jnz printNTimes