大会计划:Fizz游戏

时间:2016-03-21 07:13:01

标签: assembly x86 nasm

这个组装程序是一个Fizz游戏。它应该遵循儿童计数游戏Fizz的规则:它应该从1-100打印,只要数字可以被5整除,或者包含数字5,就用“Fizz”这个词替换数字。

我目前对此计划有疑问。该程序运行但输出是: 数字= 1 分段故障(核心转储) 如果有人能帮助我,我将不胜感激。谢谢

MethodVisitor

1 个答案:

答案 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