我相信大家对C有了一定的了解。既然如此,那么应该都用过C中的循环语句吧!考虑如下伪码:
前面我们刚刚讲到汇编的如果操作,那么,现在考虑while是如何实现的。
while是如果满足条件,那就继续执行语句。喔!想想看,我们也能实现啊!只需要不断跳转到自身开始就可以了。
先跳转到循环开始,与另一数字比较,如果小于,跳转到某段代码,然后我们处理后再跳转回循环开始,再进行比较,如此循环。如果不再小于(等于了),ret 返回调用处。
打开notepad++新建文件,保存为jc04.asm,将代码框架输入进去。
如果你上次没记住代码框架,赶紧记住啊!
记住了?好的!我们写一个程序,某变量值为0,它使用ebx装数据,当ebx>=10时退出程序。
输入框架代码,保存为jc04.asm,开始代码高亮功能。
给数据段内增加两个变量,一个是装显示文本的text,一个是存储格式化文本要用到的字符串"%d"。
前面说道,我们用ebx装数据,所以,ebx要初始化为0。在WinMain有效代码段(不知道是什么的返回读框架代码)里把ebx置为0(mov ebx,0)。然后,在其他功能过程(不懂的返回看是框架代码)里写while的判断语句和循环体。判断语句是:判断条件是否成立,如果成立,跳转到循环 体,循环体执行完毕后再跳转回循环判断,再次判断,再跳转,直到不成立,jb(小于跳转)指令无效时(即它执行的条件不足)执行ret返回 WinMain。
误区警示:
我在写到这里时,发觉“调用”(call)和“跳转”“跳转到”(jmp和其他jcc(条件跳转)指令)不同,call指令允许你执行到ret时返回到调 用处执行下一条指令,但jmp不能处理ret指令,所以我力求措辞准确,调用就是调用,跳转就是跳转。毕竟我在写示例代码时正巧被jmp和call卡住 了,造成程序有误。
好了,我们先前刚刚学了if判断语句,对我们现在来说,正好可以用到,写如下循环判断代码:
现在我们写循环体语句:
现在,全部代码应该和现在有点类似(不一定完全一样):
编译:nasm -f win32 jc04.asm (以后不再说这个了,就是 nasm -f win32 文件名.asm)
链接:golink /entry _main jc04.obj user32.dll kernle32.dll
(以后也不说这个了,就是golink /entry _main 文件名.obj user32.dll kernle32.dll)
找到jc04.exe运行看看?是不是会弹出1,按下按钮再弹出2,然后3、4、5……?然后还带“i”图标?是不是很有成就感呢?
习题:
(1)弹出提问框,按下“确认”键循环10次,按下“取消”键退出程序(返回到WinMain中即可)。而且循环十次的值用提示框显示出来,包括信息图标 ("i"图标)和确认取消键,如果按下确认键重新循环,如果按下取消键继续循环。
(2)详解前测试型循环是如何完成的?