【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. hdu 1171 Big Event in HDU(多重背包+二进制优化)

    题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...

  2. Java垃圾回收器

    一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...

  3. Notes on Probabilistic Latent Semantic Analysis (PLSA)

    转自:http://www.hongliangjie.com/2010/01/04/notes-on-probabilistic-latent-semantic-analysis-plsa/ I hi ...

  4. iepngfix.htc让PNG-24在IE6中透明的方法(转)

    add:360用的一个方法: <!--[if IE 6]> <script src="http://se.360.cn/js/DD_belatedPNG.js"& ...

  5. 新唐M0 ISP下载要点

    http://blog.csdn.net/rejoice818/article/details/7736029 一.注意:官方光盘内“Software Utilities”目录下,可找到ICP或ISP ...

  6. uva387 - A Puzzling Problem

    A Puzzling Problem The goal of this problem is to write a program which will take from 1 to 5 puzzle ...

  7. FluentData官方文档翻译

    开始 要求 .NET 4.0. 支持的数据库 MS SQL Server using the native .NET driver. MS SQL Azure using the native .NE ...

  8. mysql主从同步单个表实验记录

    问题的提出: 在CRM管理系统与运营基础数据平台之间需要有数据表进行交换,说是交换,其实是单向的,就是CRM里面的一些数据需要实时同步到运营基础数据平台中. 解决方案: A.采用时间戳的办法进行代码开 ...

  9. C# Redis分布式缓存

    C# Redis实战(七) 七.修改数据 在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据.大家都知道Redis是key-value型存储系 ...

  10. TP复习10

    i * { padding:0; margin:0; } 居中 ## ThinkPHP 3.1.2 模板中的变量#讲师:赵桐正微博:http://weibo.com/zhaotongzheng 本节课 ...