下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是 cmmp 指令和跳转指令,这一点估计大家也预料到了。
没错,条件分支就是利用这些指令来实现的。不过,为了以防万我们来确认一下。代码清单 10-11 是,根据变量 a 的值来调用不同函数(MySubl 函数、MySub2 函数、MySub3 函数)的 C语言源代码为了实现条件分支,这里使用了 if语句。示例中被调用的各个函数都不进行任何处理。将代码清单 10-11 的MyFunc 函数处理转换成汇编语言源代码后,结果就如代码清单 10-12 所示。
代码清单 10-12 中用到了三种跳转指令,分别是比较结果小时跳转的 jle (jump on less or equal)、 大时跳转的jge (jump on greater orequal)、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的 cmp 指令,比较结果被保存在了标志寄存器中。这里我们添加了注释,大家不妨顺着程序的流程看一下。虽然同 C 语言源代码的处理流程不完全相同,不过大家应该知道处理结果是相同的。此外还有一点需要注意的是,eax 寄存器表示的是变量 a。
虽然大部分的 C 语言参考书中都写着“为了便于理解程序的结构应尽量避免使用无条件分支的 goto 语句”,不过,在汇编语言这一领域中,如果不使用相当于C语言 goto 语句的jmp 指令,就无法实现循环和条件分支。由此看来,关于应不应该在 C 语言中使用 goto 语句,大家没有必要这么紧张。
标签:10,源代码,函数,指令,跳转,10.12,方法,分支 From: https://www.cnblogs.com/z1218/p/17099769.html