【1】说说条件码
最常用的的条件码有:
- CF:进位标志 (无符号溢出)
- ZF:零标志
- SF:符号标志(结果为负数)
- OF:溢出标志 (补码溢出, 有符号溢出)
【2】有两类指令设置条件码而不改变任何其他寄存器
cmp(cmpb, cmpw, cmpl) + test(testb, testw, testl)
You should know
- if-else + 循环(while + for + do-while ) + switch , 都是以跳转指令为基础的。
- switch 的重点在于使用了 称为 “跳转表”的一个数据结构。
条件传送指令,如cmovl (contidional mov less )
【3】跳转指令及其编码(jmp 及其 jmp编码)
804828f : 74 05 ;je XXXXXX=0x05+0x8048291=0x8048296
(也即jmp编码后的代码存储的是相对于它下一条指令的偏移地址)-(干货)
8048291 : e8 1e 00 00 00 call 80482b4
【4】(if-else+循环+switch)汇编规则
4.1)翻译条件分支if-else(基于条件传送指令的if-else汇编代码)
从上图中的汇编代码,我们可以看到,if-else的汇编规则(干货)
- 1)先将变量暂存在registers中;
- 2)汇编计算 if-else 里面的表达式;
- 3)汇编比较 if-else的条件表达式;
- 4)then ……
4.2)循环( do-while + while + for )
4.2.1)do-while 汇编规则
由上图,我们知道 do-while 循环的汇编规则(干货)
- 1)暂存变量到registers,并初始化;
- 2)汇编执行循环主体
- 3)汇编计算while中的条件表达式的值(true or false);
4.2.2)while 汇编规则
由上图,我们知道while循环的汇编规则(干货)
- 1)暂存变量到registers, 并初始化;
- 2)汇编计算条件表达式的值(true or false);
- 3)汇编执行循环体;
- 4)再次汇编计算条件表达式的值(true or false);
4.2.3)for 汇编规则
由上图,我们知道for循环的汇编规则如下(干货)
- 1)暂存变量到registers, 并初始化;
- 2)汇编计算条件表达式的值(true or false);
- 3)汇编执行循环体;
- 4)汇编自增计数值i;
- 5)再次汇编计算条件表达式的值(true or false);
4.3) switch 汇编规则
从上图中的汇编代码,我们可以看到,switch的汇编规则(干货)
- 0)仔细看上图的.L7代码的排序,很有韵味;
- 1)用registers来存储变量;
- 2)判断n的case索引值偏移量(是否小于等于6):否》跳转到默认case;是》跳入case的偏移量地址;6是.L7表中表项的最大偏移值,7个表项(100, 101, 102, 103, 104, 105, 106),最大偏移值为6(基地址base=100);
(Attention): switch的(干货)就是它使用了一个叫做跳转表的东西, 而.L7 就是跳转表;
【5】条件传送指令
如条件传送指令 cmovl == contional mov l(后缀)
总的来说,条件数据传送指令提供了一种用条件控制转移来实现条件操作的替代策略。