windows系统-函数的条件分支实现用汇编语言解释
下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是cmp指令和跳转指令,这一点估计大家也预料到了。
没错,条件分支就是利用这些指令来实现的。不过,为了以防万一,我们来确认一下。代码清单10-11是,根据变量a的值来调用不同函数(MySub1函数、MySub2函数、MySub3函数)的C语言源代码。为了实现条件分支,这里使用了if语句。示例中被调用的各个函数,都不进行任何处理。将代码清单10-11的MyFunc函数处理转换成汇编语言源代码后,结果就如代码清单10-12所示。
代码清单10-11 进行条件分支的C语言源代码
//定义MySub1函数
void MySub1()
{
//不做任何处理
}
//定义MySub2函数
void MySub2()
{
//不做任何处理
}
//定义MySub3函数
void MySub3()
{
//不做任何处理
}
//定义MyFunc函数
void MyFunc()
{
int a =123;
//根据条件调用不同的函数
if (a > 100)
{
MySub1();
}
else if (a < 50)
{
MySub2();
}
else
{
MySub3();
}
}
代码清单10-12 将代码清单10-11的MyFunc函数转换成汇编语言后的结果
_MyFunc proc near
push ebp;
mov ebp, esp;
mov eax,123 ;把123存入eax寄存器中
cmp eax,100 ;把eax寄存器的值同100进行比较
jle short @8 ;等于或小于100时,跳转到@8标签
call _MySub1 ;调用MySub1函数
jmp short @11 ;跳转到@11标签
@8: cmp eax,50 ;把eax寄存器的值同50进行比较
jge short @10 ;大于等于50时,跳转到@10标签
call _MySub2 ;调用MySub2函数
jmp short @11 ;跳转到@11标签
@10: call _MySub3 ;调用MySub3函数
@11: pop ebp
ret
_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系统-函数的条件分支实现用汇编语言解释相关推荐
- windows.h系统函数
// Windows系统函数.cpp: 定义控制台应用程序的入口点. //#include "stdafx.h" #include <windows.h> #inclu ...
- API(1)——打印系统开发(32)——Windows API函数大全(精心总结)
目录 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. API之位图.图标和光栅运算函数 ...
- Windows 系统API 函数快速查找
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
- shell编程之函数和case多条件分支语句
shell编程之函数和case多条件分支语句 函数介绍 函数语法定义 通过函数编写功能脚本 case语句 case条件分支语句介绍 函数介绍 函数介绍: shell 中允许将一组命令集合或语句形成一段 ...
- windows系统中创建线程常用哪几个函数,有什么区别?
windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...
- [笔记]使用API函数 GetACP 获取Windows系统当前代码页
代码页是字符集编码的别名,也称"内码表",是特定语言的字符集的一张表. 代码页分为两种:一种是ANSI代码页:另一种是OEM代码页. ⑴OEM代码页主要是用于Windows系统中的 ...
- Ubuntu和windows双系统并存条件下,在Windows系统内插耳机没有声音的问题
本人闲来无事给自己电脑装了三个系统,一个Windows7一个Windows8再来一个Ubuntu系统,平时用这没事,但是有一段时间经常Ubuntu系统和Windows系统来回切换着使用,突然就发现一个 ...
- 使用API函数 GetACP 获取Windows系统当前代码页(字符编码)
代码页是字符集编码的别名,也称"内码表",是特定语言的字符集的一张表. 代码页分为两种:一种是ANSI代码页:另一种是OEM代码页. ⑴OEM代码页主要是用于Windows系统中的 ...
- Windows API函数大全
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
最新文章
- ubuntu14.04下mysql数据库的默认存放路径并修改
- android之SharedPreferences
- 我们未能完成您的购买_销售完成后,客户的消极情绪产生的原因及处理方法
- 最美的十大精典爱情句子
- 电脑关机很慢是怎么回事
- 面试题--------9、mysql的drop delete truncate 分别在什么场景下使用
- python爬虫什么框架好用_推荐十款高效率的Python爬虫框架,你用过几个?
- iOS图形学(一):viewWillUnload和内存警告
- cocos2d-x2.2.5走四棋儿源代码“开源”
- JAVA程序设计(学堂在线-清华大学) 课后练习题 已更新完毕
- cadence allegro 绘制蛇形等长线
- 思科关闭日志_Cisco命令日志
- 【智能制造】智能制造50大产业链全景图
- idea复制代码空格报错
- android 如何读取u盘中数据恢复,U盘数据恢复常见问题及恢复方法汇总
- setheader是什么意思_HTTP 请求头 响应头信息含义
- Wince电源管理(五) ---- Windows CE设备驱动开发之电源管理
- fanc 机器人_24个FANUC机器人的视觉功能详细介绍
- 了解cuda和显卡等基本概念
- matlab对图像频谱图分析,应用Matlab对图像信号进行频谱分析及滤波
热门文章
- datagridview滚动条自动滚动_微软新贡献:进一步优化Chromium的滚动特性
- VS与QT的路径查找差异
- php购票排位_用PHP+MySQL实现12306购票和退票以及余票查询逻辑
- html input 字体颜色_input使用小技巧
- 光伏智能道路_这条光伏公路,能承重,晒太阳能发电,西方国家:中国技术好...
- c语言输入身高计算标准体重_体侧标准||身高、体重测试评分标准
- rapidjson读取json文件_SPARK入门 - json文件读取
- sql每个月每个人的花销占比_星座月运(2020年12月),每个人开支花费大,得精打细算...
- 单手撑跨栏、两个空翻,终于看到了比人厉害的机器人
- 15岁杀人犯监狱学编程,37岁保释年薪70万