这个组装程序是一个Fizz游戏。它应该遵循儿童计数游戏Fizz的规则:它应该从1-100打印,只要数字可以被5整除,或者包含数字5,就用“Fizz”这个词替换数字。
我目前对此计划有疑问。该程序运行但输出是: 数字= 1 分段故障(核心转储) 如果有人能帮助我,我将不胜感激。谢谢
MethodVisitor
答案 0 :(得分:0)
您的程序崩溃了,因为您在函数调用期间没有考虑ECX
更改,并且您的推送/弹出不平衡。请注意:
push ecx
push fmt
call printf
但你从来没有pop
这两个值从堆栈中退出。由于ECX
未在调用中保留,并且在函数返回后不执行任何其他操作,因此您依赖于函数调用之后发生的任何ECX
。
如果查看calling conventions,您会发现函数调用中未保留ecx
。您可能会发现它没有变化,但您不能依赖于此。你必须保留它。
这导致代码立即跳转到end
并尝试ret
。这将立即崩溃,因为您现在正在尝试返回格式字符串的地址,因为它是堆栈下一步的内容。
也许这个?
push ecx
push fmt
call printf
pop ecx ; fmt
pop ecx ; ECX
cmp ecx, 100
jle end