下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是cmp指令和跳转指令,这一点估计大家也预料到了。

没错,条件分支就是利用这些指令来实现的。不过,为了以防万一,我们来确认一下。代码清单10-11是,根据变量a的值来调用不同函数(MySub1函数、MySub2函数、MySub3函数)的C语言源代码。为了实现条件分支,这里使用了if语句。示例中被调用的各个函数,都不进行任何处理。将代码清单10-11的MyFunc函数处理转换成汇编语言源代码后,结果就如代码清单10-12所示。

代码清单10-11 进行条件分支的C语言源代码

  1.     //定义MySub1函数

  2.     void MySub1()

  3.     {

  4.           //不做任何处理

  5.     }

  6.     //定义MySub2函数

  7.     void MySub2()

  8.     {

  9.         //不做任何处理

  10.     }

  11.     //定义MySub3函数

  12.     void MySub3()

  13.     {

  14.         //不做任何处理

  15.     }

  16.     //定义MyFunc函数

  17.     void MyFunc()

  18.     {

  19.         int a =123;

  20.         //根据条件调用不同的函数

  21.         if (a > 100)

  22.         {

  23.             MySub1();

  24.         }

  25.         else if (a < 50)

  26.         {

  27.             MySub2();

  28.         }

  29.         else

  30.         {

  31.             MySub3();

  32.         }

  33.     }

代码清单10-12 将代码清单10-11的MyFunc函数转换成汇编语言后的结果

  1.     _MyFunc         proc     near

  2.             push    ebp;

  3.             mov     ebp, esp;

  4.             mov     eax,123         ;把123存入eax寄存器中

  5.             cmp     eax,100         ;把eax寄存器的值同100进行比较

  6.             jle     short @8        ;等于或小于100时,跳转到@8标签

  7.             call    _MySub1         ;调用MySub1函数

  8.             jmp     short @11       ;跳转到@11标签

  9.        @8:  cmp     eax,50          ;把eax寄存器的值同50进行比较

  10.             jge     short @10       ;大于等于50时,跳转到@10标签

  11.             call    _MySub2         ;调用MySub2函数

  12.             jmp     short @11       ;跳转到@11标签

  13.        @10: call    _MySub3         ;调用MySub3函数

  14.        @11: pop     ebp

  15.             ret

  16.       _MyFunc      endp

代码清单10-12中用到了三种跳转指令,分别是比较结果小或相等时跳转的jle(jump on less or equal)、大或相等时跳转的jge(jump on greater or equal)、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比较结果被保存在了标志寄存器中。这里我们添加了注释,大家不妨顺着程序的流程看一下。虽然同C语言源代码的处理流程不完全相同,不过大家应该知道处理结果是相同的。此外,还有一点需要注意的是,eax寄存器表示的是变量a。

虽然大部分的C语言参考书中都写着“为了便于理解程序的结构,应尽量避免使用无条件分支的goto语句”,不过,在汇编语言这一领域中,如果不使用相当于C语言goto语句的jmp指令,就无法实现循环和条件分支。由此看来,关于应不应该在C语言中使用goto语句,大家没有必要这么紧张。

windows系统-函数的条件分支实现用汇编语言解释相关推荐

  1. windows.h系统函数

    // Windows系统函数.cpp: 定义控制台应用程序的入口点. //#include "stdafx.h" #include <windows.h> #inclu ...

  2. API(1)——打印系统开发(32)——Windows API函数大全(精心总结)

    目录 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. API之位图.图标和光栅运算函数 ...

  3. Windows 系统API 函数快速查找

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  4. shell编程之函数和case多条件分支语句

    shell编程之函数和case多条件分支语句 函数介绍 函数语法定义 通过函数编写功能脚本 case语句 case条件分支语句介绍 函数介绍 函数介绍: shell 中允许将一组命令集合或语句形成一段 ...

  5. windows系统中创建线程常用哪几个函数,有什么区别?

    windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...

  6. [笔记]使用API函数 GetACP 获取Windows系统当前代码页

    代码页是字符集编码的别名,也称"内码表",是特定语言的字符集的一张表. 代码页分为两种:一种是ANSI代码页:另一种是OEM代码页. ⑴OEM代码页主要是用于Windows系统中的 ...

  7. Ubuntu和windows双系统并存条件下,在Windows系统内插耳机没有声音的问题

    本人闲来无事给自己电脑装了三个系统,一个Windows7一个Windows8再来一个Ubuntu系统,平时用这没事,但是有一段时间经常Ubuntu系统和Windows系统来回切换着使用,突然就发现一个 ...

  8. 使用API函数 GetACP 获取Windows系统当前代码页(字符编码)

    代码页是字符集编码的别名,也称"内码表",是特定语言的字符集的一张表. 代码页分为两种:一种是ANSI代码页:另一种是OEM代码页. ⑴OEM代码页主要是用于Windows系统中的 ...

  9. Windows API函数大全

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

最新文章

  1. ubuntu14.04下mysql数据库的默认存放路径并修改
  2. android之SharedPreferences
  3. 我们未能完成您的购买_销售完成后,客户的消极情绪产生的原因及处理方法
  4. 最美的十大精典爱情句子
  5. 电脑关机很慢是怎么回事
  6. 面试题--------9、mysql的drop delete truncate 分别在什么场景下使用
  7. python爬虫什么框架好用_推荐十款高效率的Python爬虫框架,你用过几个?
  8. iOS图形学(一):viewWillUnload和内存警告
  9. cocos2d-x2.2.5走四棋儿源代码“开源”
  10. JAVA程序设计(学堂在线-清华大学) 课后练习题 已更新完毕
  11. cadence allegro 绘制蛇形等长线
  12. 思科关闭日志_Cisco命令日志
  13. 【智能制造】智能制造50大产业链全景图
  14. idea复制代码空格报错
  15. android 如何读取u盘中数据恢复,U盘数据恢复常见问题及恢复方法汇总
  16. setheader是什么意思_HTTP 请求头 响应头信息含义
  17. Wince电源管理(五) ---- Windows CE设备驱动开发之电源管理
  18. fanc 机器人_24个FANUC机器人的视觉功能详细介绍
  19. 了解cuda和显卡等基本概念
  20. matlab对图像频谱图分析,应用Matlab对图像信号进行频谱分析及滤波

热门文章

  1. datagridview滚动条自动滚动_微软新贡献:进一步优化Chromium的滚动特性
  2. VS与QT的路径查找差异
  3. php购票排位_用PHP+MySQL实现12306购票和退票以及余票查询逻辑
  4. html input 字体颜色_input使用小技巧
  5. 光伏智能道路_这条光伏公路,能承重,晒太阳能发电,西方国家:中国技术好...
  6. c语言输入身高计算标准体重_体侧标准||身高、体重测试评分标准
  7. rapidjson读取json文件_SPARK入门 - json文件读取
  8. sql每个月每个人的花销占比_星座月运(2020年12月),每个人开支花费大,得精打细算...
  9. 单手撑跨栏、两个空翻,终于看到了比人厉害的机器人
  10. 15岁杀人犯监狱学编程,37岁保释年薪70万