上一篇博客  我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。本篇博客我们来接着看汇编语言的算术与逻辑运算指令,算术无非就是加减乘除,而逻辑运算也就是与或非,移位等操作。下面这张图是汇编里面的算术和逻辑操作:

  

  上面除了 leal(加载有效地址)指令通常用来执行简单的算术操作,其余的指令都是标准的一元或者二元操作,下面我们分别来介绍这几个指令操作。

1、leal 指令

  leal 指令也称为加载有效地址(load effective address)指令,它实际上是 movl 指令的变形。它的指令形式是从存储器读数据到寄存器,但实际上它根本没有引用存储器。

  它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读取数据,而是将有效地址写入到目的操作数,类似于 C 语言的取地址操作符“&”。另外就是作普通的算术运算。

  leal  立即数,寄存器

  这类指令就是将立即数装载至寄存器,比如 leal $0x01,%eax  这种情况下 和 movl $0x01,%eax 的效果是等价的

  leal  地址,寄存器

  leal指令的作用是将地址加载到寄存器,对于leal S,D而言,就是实现了 &S –> D 的功能

  leal   S, D    结果是&S -> D

  movl  S,D   结果是S -> D

  通用的操作我们就不讲了,这里讲一下取地址操作,比如对于leal 4(%edx,%edx,4),%eax这条指令来讲,我们假设%edx寄存器的值为x的话,那么这条指令的作用就是将 4 + x + 4x = 5x + 4赋给%eax寄存器。它和mov指令的区别就在于,假设是movl 4(%edx,%edx,4),%eax这个指令,它的作用是将内存地址为5x+4的内存区域的值赋给%eax寄存器,而leal指令只是将5x+4这个地址赋给目的操作数%eax而已,它并不对存储器进行引用的值的计算。

  为了更好的表示这条指令的效果,这里简单的画个图来表示这一过程。我们假设下图是执行指令之前,寄存器和存储器的状态。

  下面的几幅图均引用:http://www.cnblogs.com/zuoxiaolong/p/computer16.html 个人觉得解释的非常形象。

  

  可以看到,此时在存储器中,地址为5x+4的区域的值为1000。那么此时若是进行movl 4(%edx,%edx,4),%eax操作,很显然,%eax的值应该为1000,也就是下图。

  

  但是如果进行leal 4(%edx,%edx,4),%eax操作的话,%eax的值就不是1000了,因为leal指令不会去取存储器当中的值,因此寄存器%eax的值应该是5x+4。

  

  试想一下,倘若在地址为5x+4的位置存储的是变量i,那么其实这条指令就相当于&i操作,这也就是C语言当中的&取地址操作的汇编级做法。

  此外,它还可以简单的描述普通的算术操作,比如假如寄存器 %edx 的值为 x,那么指令 leal 7 (%edx,%edx,4),%eax。 这表示的意思是设置寄存器 %eax 的值为 7+x+4x=5x+7。这里的leal指令根本与有效地址无关,但是需要注意的是目的操作数必须是寄存器。

2、INC、DEC、NEG、NOT 指令

  这四个指令的格式如下:

  

  这四个指令都是一元操作,即它们都只有一个操作数,即是源也是目的。这个操作数可以是寄存器,也可以是存储器。

  比如: incl (%esp)  会使栈顶的 4 字节元素加 1。可以联想到 C 语言的自增(++)或者自减(--)

3、ADD、SUB、IMUL、XOR、OR、AND 指令

  这一组指令格式如下:

  

  它们都是二元操作,其中第二个操作数即是源又是目的,我们可以联想到 C 语言的 x += y。

  第一个操作数可以是立即数、寄存器或存储器,第二个操作数可以是寄存器或存储器位置。不过和 movl 指令一样,两个操作数不能同时是存储器位置。

4、SAL、SHL、SAR、SHR 指令

  移位操作,指令格式如下:

  

  第一个操作数是移位量,SAL 和 SHL 都是左移指令,效果是一样的,移动几位,右边补上几位0;右移指令不同,算术右移 SAR 是补上符号位,即右边的第一位;逻辑右移 SHR 是补上 0 。

  移位的目的操作数可以是一个寄存器或是一个存储器位置。

深入理解计算机系统(3.4)------算术和逻辑操作相关推荐

  1. c语言语句的机器级表示实训,深入理解计算机系统(笔记):程序的机器级表示...

    分析高级语言编译后生成的汇编语言. 1. 程序编码 运行如下命令得到C语言的汇编代码: unix> gcc -O1 -S code.c gcc -c选项编译源文件生产目标文件code.o: un ...

  2. 《深入理解计算机系统(原书第三版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重 ...

  3. 深入理解计算机系统(CSAPP)含lab详解 完结

    文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...

  4. 读书笔记——《深入理解计算机系统》第三章_程序的机器级表示(一)

    前言:已经大四,没有去找工作,选择了保研,之所以这样选择,有三个原因,一.刚进校时,听说保研都是牛人才能行的事,所以一心努力保研:二.2008年开始,经济危机比较严重,工作不好找,虽然软件专业要找一份 ...

  5. 《深入理解计算机系统》CSAPP第3版术语索引表

    <深入理解计算机系统>几乎做到了只讲对程序员"有用的"原理,所以这本书性价比非常高.并没有在体系结构和操作系统的许多实现问题上纠缠. 第三版的英文原版是有index表的 ...

  6. 深入理解计算机系统_第三章_程序的机器级表示

    深入,并且广泛-沉默犀牛 文章目录 文章导读 历史观点 程序编码 机器级代码 代码示例 关于格式的注解 数据格式 访问信息 操作数指示符 数据传送指令 数据传送示例 压入和弹出栈数据 算术和逻辑操作 ...

  7. 深入理解计算机系统(中文版第二版)

    下载地址:网盘下载 内容简介  · · · · · · 从程序员的视角,看计算机系统! 本书适用于那些想要写出更快.更可靠程序的程序员.通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更 ...

  8. 深入理解计算机系统(3.3)------操作数指示符和数据传送指令

    在上一篇博客 程序编码以及数据格式 中我们给出了一个简单的C程序,然后编译成了汇编代码.大家看不懂没关系,后面的博客我们将逐渐揭开一些汇编指令的神秘面纱.本篇博客我们将对操作数指示符和数据传送指令进行 ...

  9. 《深入理解计算机系统》学习笔记:程序的机器级表示

    目录 概述 一.历史观点 二.程序编码 2.1.机器级代码 2.2.代码示例 2.3.关于格式的注解 三.数据格式 四.访问信息 4.1.操作符指示符 4.2.数据传送指令 4.2.1.源操作数和目的 ...

最新文章

  1. django权限系统实现步骤_Django密码系统实现过程详解
  2. iphone屏幕录制_今日应用:iPhone 不越狱也可以录制屏幕了
  3. 如何基于OceanBase构建应用和数据库的异地多活
  4. Manjaro Linux执行某些命令缺少libtinfo.so.5问题
  5. POI文件导入:需求说明
  6. .NET 6新特性试用 | 无需配置开发人员异常页
  7. 这个C怎么了?求大佬指教
  8. 一条语句复制整个目录《转》
  9. 《大话软件工程—需求分析与软件设计》,给出了分析与设计过程中需要的理论、方法、工具和标准
  10. WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试) 接口测试与数据驱动...
  11. springboot-异步线程调用
  12. 网络与综合布线及无线传输
  13. 模拟电子技术基础-第一章-常用半导体器件
  14. 基于Android的天气预报APP设计与实现
  15. 智能摄像头视频监控,智和信通一站式解决方案
  16. 给随便一个字符串加单位
  17. 显卡性能暴涨,2K高清+144hz显示器飞入寻常百姓家
  18. 现代轻奢风格装修讲解
  19. 小数点化分数的过程_小学数学分数和小数互化知识点归纳
  20. linux中一次显示一页内容的命令

热门文章

  1. easyUI实现tabs形式
  2. 用PHP实现var_export
  3. Thinkpad SL400 issue
  4. 使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇
  5. SolrCloud在linux上的搭建
  6. 数组、哈希以及其他枚举类型
  7. Theano - 循环
  8. HDU1013 POJ1519 Digital Roots(解法二)
  9. JAVA中的Font
  10. 如何退出Activity?如何安全退出已调用多个Activity的Application?