用NASM编写Win32应用程序(5)——汇编的前测试型循环操作

我相信大家对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)详解前测试型循环是如何完成的?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值