基础[语法] 汇编层面if语句和switch的区别

205 阅读1分钟

在读一些别人写的代码的时候,他们经常会写很多if-else全等判断,这种代码与switch有什么区别呢?,本次打算做个尝试,试图从汇编层面直观地查看二者的区别。下面的两个函数都是主函数,只判断type为[0-4的情况],其余情况为0x55

image.png

经过汇编后的代码如下

image.png

上述涉及到的汇编指令如下

  • movel 将源操作数传送给目标操作数
  • cmpl 两个操作数相减,且不保存结果,但结果改变eflags寄存器的ZF标志位
  • jne 条件跳转,如果eflags的标志位为0,则跳转
  • jmp 无条件跳转
  • je 条件跳转,如果eflags的ZF位为1,则跳转
  • jg 条件跳转,若左边大于右边则发生跳转
  • call 方法调用

但是switch语句中生成的汇编中对于3进行了多次比较,但跳转的方式不同,因为我们比较的是[0-4]的离散整数,所以jg不会执行。

左侧if语句的每一次比较后都会先判断条件是否成立,再执行复合条件的跳转。

右侧switch 语句则是先判断整个条件,再跳转到相应的代码块中执行对应的程序。