这两天学JAVA,没更新过了。。switch结构
C语言代码:
#include <stdio.h> int main() { int a = 1; switch (a) { case 0: a = 1; break; case 1: a = 0x10; break; case 2: a = 0x20; } return 0; }
简单理解一下这段代码,定义一个整型变量a,并给它赋值1,然后是一个switch结构,检测a的值,为0时给a赋值1,为1时给a赋值0x10,为2时给a赋值x20。编译这段代码,使用IDA分析,反汇编代码如下:
.text:00401000 push ebp .text:00401001 mov ebp, esp .text:00401003 sub esp, 8
上一节中就说过一个int型的变量占用4字节的内存空间,但是明明程序只定义了一个int型的变量a,为什么这里会从栈里压出8字节的内存空间?继续向下看:
.text:00401006 mov [ebp+a], 1 .text:0040100D mov eax, [ebp+a] .text:00401010 mov [ebp+var_8], eax
这里给变量a赋值1,然后保存一个副本到刚才从栈里压出来8个字节里的另外4个字节。
.text:00401013 cmp [ebp+var_8], 0 .text:00401017 jz short loc_401027 .text:00401019 cmp [ebp+var_8], 1 .text:0040101D jz short loc_401030 .text:0040101F cmp [ebp+var_8], 2 .text:00401023 jz short loc_401039 .text:00401025 jmp short loc_401040
这里把刚才储存的副本分别和0、1、2比较,如果相等就跳转到对应位置,如果都不相等则跳到最后。
.text:00401027 mov [ebp+a], 1 .text:0040102E jmp short loc_401040 .text:00401030 mov [ebp+a], 10h .text:00401037 jmp short loc_401040 .text:00401039 mov [ebp+a], 20h
这里是刚才的三个比较对应的处理部分,可以发现break语句对应的是一句jmp指令,直接跳转到switch结构的结尾。
.text:00401040 xor eax, eax .text:00401042 mov esp, ebp .text:00401044 pop ebp .text:00401045 retn