控制语句(if-else+循环+switch)汇编规则
【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(后缀)
总的来说,条件数据传送指令提供了一种用条件控制转移来实现条件操作的替代策略。
版权声明:本文为博主原创文章,未经博主允许不得转载。
控制语句(if-else+循环+switch)汇编规则的更多相关文章
- 简易计算器实现:while循环+switch语句
个人练习: 写一个计算器,要求实现加减乘除功能,并且能循环接收新的数据,通过用户交互实现(即Scanner对象) 用到了 while循环 switch语句,实现了数据的循环输入并计算!!!!妙啊!!! ...
- Java控制语句——分支、循环、跳转
分支语句(if语句,switch语句): 循环语句(for,while,do...while); 跳转语句(break,continue,return): 分支语句(if语句,switch语句) if ...
- Python基础2:流程控制语句 while / for循环
[ while 循环 ] 如果要计算1+2+3,我们可以直接写表达式: >>> 1 + 2 + 3 要计算1+2+3+...+10,勉强也能写出来. 但是,要计算1+2+3+...+ ...
- 控制语句 for while if switch
一.for…in 结构 for i in 0...4{ print(i) //使用到了变量 i } for _ in 0...1{ // 后期没有使用到变量,可以直接用个下划线 _ 占位就行 ...
- 1-23-shell脚本之-if流程控制语句和for循环语句的使用
大纲: 1.逻辑判断 2.if流程控制语句 3.for循环控制语句 ---------------------------------------------- 在开始之前,先了解一下逻辑判断符号 ...
- Go-函数高级使用-条件分支-包管理-for循环-switch语句-数组及切片-与或非逻辑符
目录 科普 python 注释 # 函数高级 if else if else 包管理 下载第三方包 比较热门的框架 for 循环 for 循环的几种写法 switch 语句 数组及数组切片 数组迭代 ...
- linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句
条件测试操作 条件测试是专为影响"$?"的操作,是条件转移.循环语句的基础 test测试命令: test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0, ...
- oracle的控制语句if和循环语句loop while for
pl/sql的控制结构if-then if-then-else if-then-elsif-else 案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10% ...
- for循环的表达规则,for循环的嵌套,跳转语句;穷举;迭代;异常处理
for循环的基本格式 for(表达式1:表达式2:表达式3) { 循环体: } for循环的四要素 表达式1就是变量初始化:表达式2就是循环条件:表达式3是状态改变 static void Main( ...
随机推荐
- UVa 10004:Bicoloring
这道题要我们判断所给图是否可以用两种颜色进行染色,即"二染色“.已知所给图一定是强连通图. 分析之: 若图中无回路,则该图是一棵树,一定可以二染色. 若图中有回路,但回路有偶数个节点,仍然可 ...
- canvas加载gif
http://ernestdelgado.com/public-tests/gifoncanvas/ <!DOCTYPE html><html><head> < ...
- OC:点语法
IOS中的@property 与 assign copy retain 的区别参考 //@理解为 OC 代码的标记 //如何去创建一个对象 创建对象的两步: // (1)为对象在堆区中开辟空间 Stu ...
- cocos2dx shader实现灰度图android后台切换回来导致图像偏移的问题
转自:http://www.tuicool.com/articles/U3URRrI 项目中经常会遇到将一张图像处理成灰色的需求,为了节省资源,一般不会让美术再做一套同样的灰度图,通常会通过代码处理让 ...
- Codeforces Round #310 (Div. 1) C. Case of Chocolate set
C. Case of Chocolate Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/555/ ...
- git项目添加.gitigore文件
以前一直没有注意这个文件,最近读到了黄勇的<架构探险>,觉得这个文件还是很有用的. .gitigore文件可以自己配置. 我使用的是书中所用的配置,简洁明了. # Maven # targ ...
- 我的git使用记录
git的教程现在琳琅满目,需要学习的东西也有很多,一下子接受不了那么多的东西,所以打算记录在实用的过程中常用的操作和遇到的问题. 基本操作 git init git add . git add -A ...
- linux C(hello world)最大公约数和最小公倍数
# include <stdio.h> int main(void) { int x, y,temp; int r; printf("请输入两个正整数:\n"); sc ...
- Android学习笔记(四十):Preference的使用
Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...
- //判断是否安装Flash插件
//判断是否安装Flash插件 var swf; function IE_Flash() { try { var swf ...