1简单switch-case分支识别
sub eax,0
je
用eax-0代替cmp
当eax为0时,结果自然会使ZF置1。
A如果从1开始自增的case,用倒序减法跳转。
B如果从0开始自增的case,将不同case目标地址的值存储在相邻的数据段中,
用jmp ds:[eax*4+0x??????]指令来跳转。
(这是数组寻址操作,即读取int型数组的操作)
2复杂一些的例子
A增强1.B中的例子:
从0开始的case,如果遇到列表中没有的case则该地址指向default。
3该分支结构与稀疏矩阵(间接表)
当“列表缺失”严重导致大量default时的一种解决方案。
(实际发现,编译器用if-else来识别这种情况汗)
本质是:用1字节来表示最小索引值与最大索引值之差不大于256的分支表。
movz ecx,ds:byte_4010A8[eax]
4该分支结构与平衡二叉树
什么是AVL?虽然大体明白,但是不明白该算法。汗
平衡二叉树为:
(1)如果二叉树为空,返回真
(2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,其他返回假继续晕
最小索引值与最大索引值之差大于256:
使用平衡二叉树表示。
理解switch-case语句的编译,主要是两种数据结构的应用。
版权声明:本文为博主原创文章,未经博主允许不得转载。