Win知识 - 程序是怎样跑起来的——条件分支的实现方法

简介: Win知识 - 程序是怎样跑起来的——条件分支的实现方法

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


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


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

//定义MySub1函数voidMySub1()    {//不做任何处理    }//定义MySub2函数voidMySub2()    {//不做任何处理    }//定义MySub3函数voidMySub3()    {//不做任何处理    }//定义MyFunc函数voidMyFunc()    {inta=123;//根据条件调用不同的函数if (a>100)        {MySub1();        }elseif (a<50)        {MySub2();        }else        {MySub3();        }    }

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

_MyFuncprocnearpushebp;movebp, esp;moveax,123;把123存入eax寄存器中cmpeax,100;把eax寄存器的值同100进行比较jleshort@8;等于或小于100时,跳转到@8标签call_MySub1;调用MySub1函数jmpshort@11;跳转到@11标签@8:  cmpeax,50;把eax寄存器的值同50进行比较jgeshort@10;大于等于50时,跳转到@10标签call_MySub2;调用MySub2函数jmpshort@11;跳转到@11标签@10: call_MySub3;调用MySub3函数@11: popebpret_MyFuncendp

代码清单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语句,大家没有必要这么紧张。


目录
相关文章
|
8月前
|
存储 算法 Swift
Swift开发——循环执行方式
Swift语言中的循环主要包括`for-in`和`while`结构。`for-in`适用于遍历数字区间、字符串和字典,支持使用`stride`函数定制步进。字典遍历时,可以用二元元组`(k, v)`访问键值对。`while`循环有标准形式和`repeat-while`形式,确保至少执行一次循环体。程序示例展示了`for-in`和不同`while`结构的用法,包括计算阶乘、奇数和、加密字符串以及最大公约数和最小公倍数。
58 0
Swift开发——循环执行方式
|
9月前
|
IDE 编译器 Shell
运行C程序的步骤与方法
C语言是一种通用、过程式的计算机编程语言,广泛应用于系统软件与应用软件的开发中。本文将详细介绍如何编写、编译和运行一个简单的C程序,并附上相应的代码示例。
254 0
|
Shell Linux Go
《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组
《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组
140 0
|
存储 自然语言处理 编译器
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
|
Ubuntu Linux Windows
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
在Qt软件中实现部分终端控制命令行功能,使软件内可以又好的模拟终端控制,提升软件整体契合度。
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
|
C#
C# 判断当前控制台程序是否重复运行
C# 判断当前控制台程序是否重复运行
187 0
|
Shell 数据安全/隐私保护
shell脚本——八个循环实验(使用while循环)(下)
实验一 实验要求:计算从1到100所有整数的和。 创建脚本:
166 0
|
测试技术 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
926 0
 pycharm不以pytest方式运行,想要切换回普通模式运行的操作
|
编译器 C语言
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
147 0
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
|
存储 编译器 C语言
Win知识 - 程序是怎样跑起来的——函数调用机制
Win知识 - 程序是怎样跑起来的——函数调用机制
116 0
Win知识 - 程序是怎样跑起来的——函数调用机制