【1】说说条件码

最常用的的条件码有:

  • CF:进位标志 (无符号溢出)
  • ZF:零标志
  • SF:符号标志(结果为负数)
  • OF:溢出标志 (补码溢出, 有符号溢出)

【2】有两类指令设置条件码而不改变任何其他寄存器

cmp(cmpb, cmpw, cmpl) + test(testb, testw, testl)

You should know

  1. if-else + 循环(while + for + do-while ) + switch , 都是以跳转指令为基础的。
  2. 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(后缀)

总的来说,条件数据传送指令提供了一种用条件控制转移来实现条件操作的替代策略。

版权声明:本文为博主原创文章,未经博主允许不得转载。

控制语句(if-else+循环+switch)汇编规则的更多相关文章

  1. 简易计算器实现:while循环+switch语句

    个人练习: 写一个计算器,要求实现加减乘除功能,并且能循环接收新的数据,通过用户交互实现(即Scanner对象) 用到了 while循环 switch语句,实现了数据的循环输入并计算!!!!妙啊!!! ...

  2. Java控制语句——分支、循环、跳转

    分支语句(if语句,switch语句): 循环语句(for,while,do...while); 跳转语句(break,continue,return): 分支语句(if语句,switch语句) if ...

  3. Python基础2:流程控制语句 while / for循环

    [ while 循环 ] 如果要计算1+2+3,我们可以直接写表达式: >>> 1 + 2 + 3 要计算1+2+3+...+10,勉强也能写出来. 但是,要计算1+2+3+...+ ...

  4. 控制语句 for while if switch

    一.for…in 结构 for i in 0...4{ print(i)    //使用到了变量 i } for _ in 0...1{  // 后期没有使用到变量,可以直接用个下划线 _  占位就行 ...

  5. 1-23-shell脚本之-if流程控制语句和for循环语句的使用

    大纲: 1.逻辑判断 2.if流程控制语句 3.for循环控制语句   ---------------------------------------------- 在开始之前,先了解一下逻辑判断符号 ...

  6. Go-函数高级使用-条件分支-包管理-for循环-switch语句-数组及切片-与或非逻辑符

    目录 科普 python 注释 # 函数高级 if else if else 包管理 下载第三方包 比较热门的框架 for 循环 for 循环的几种写法 switch 语句 数组及数组切片 数组迭代 ...

  7. linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句

    条件测试操作 条件测试是专为影响"$?"的操作,是条件转移.循环语句的基础   test测试命令: test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0, ...

  8. oracle的控制语句if和循环语句loop while for

    pl/sql的控制结构if-then if-then-else if-then-elsif-else 案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10% ...

  9. for循环的表达规则,for循环的嵌套,跳转语句;穷举;迭代;异常处理

    for循环的基本格式 for(表达式1:表达式2:表达式3) { 循环体: } for循环的四要素 表达式1就是变量初始化:表达式2就是循环条件:表达式3是状态改变 static void Main( ...

随机推荐

  1. java dbcp连接池的使用

    package com.jb.jubmis.comm; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQL ...

  2. windows 下使用免安裝版MySql5.5

    windows 下使用面安裝版MySql5.5步驟如下 1.解壓下載的壓縮文件到指定文件夾.如:F:\DB\mysql-5.5.18-win32\mysql-5.5.18-win32: 2.在根目錄F ...

  3. 在jybot下跑Selenium2Library

    应用场景:项目组要将原有SeleniumLibrary写的脚本切换到Selenium2Library(后称S2L)下,但是原来有很多Java写的库,综合考虑认为还是在Jython下跑比较合适.但是安装 ...

  4. 传参方式由url携带改为post提交

    参考:http://www.cnblogs.com/logon/p/3218834.html 我们这里使用了iframe嵌套form表单POST提交,很简单,却能满足get|post等任何复杂情况的要 ...

  5. (剑指Offer)面试题20:顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  6. Linq使用Group By经验总结

    1.计数 var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, NumProducts = ...

  7. Builder

    Builder模式的使用情景 相同的方法, 不同的执行顺序, 产生不同的事件结果 多个部件或零件, 都可以装配到一个对象中, 但是产生的运行结果又不相同 产品类比较复杂, 或者产品类中的调用顺序不同产 ...

  8. Windows 错误代码

    Error Messages for Windows http://www.gregorybraun.com/MSWINERR.ZIP Server 4.0 Error Messages   Code ...

  9. PostgreSQL中的数组与Any

    建立表: CREATE TABLE sal_emp ( name text, pay_by_quarter integer[], schedule text[][] ); 插入数据: INSERT I ...

  10. Android Volley框架的使用(二)

     此博文源码下载地址  https://github.com/Javen205/VolleyDemo.git 使用请求队列RequestQueue Volley中的Request都需要添加到Reque ...