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

  上一篇博客  我们介绍了几种数据传送指令,包括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 。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逆向技术

16位汇编第五讲各种指令详解第一讲

汇编指令详解 8080指令详解 1.8086系统下,Inter指令系统共有117条指令(看似很多,分一下类) 1.数据传送类指令(专门传送数据的) 2.算术运算...

1875
来自专栏Java帮帮-微信公众号-技术文章全总结

Servlet学习知识总结

什么是Servlet Servlet是一个功能,如果你希望你的项目功能多一些,那就要多写一此Servlet; Servlet是JavaWeb三大组件之一,也是最...

2444
来自专栏技术碎碎念

sql server 2008 操作数据表

SQL Server表 表的类型: ①临时表 临时表可用来处理中间数据或者用临时表 与其它连接共享进行中的工作。临时表只 能放在tempdb中。 私有临时表(#...

3865
来自专栏Petrichor的专栏

tensorflow: 对variable_scope进行reuse的两种方法

在tensorflow中,为了 节约变量存储空间 ,我们常常需要通过共享 变量作用域(variable_scope) 来实现 共享变量 。

3485
来自专栏JavaQ

你写的单例真的对吗

单例模式是设计模式中最容易理解、最容易上手的设计模式,同时也是最容易出错的设计模式。它的实现写法有多种,但是并不都是正确的写法。 1饿汉模式 饿汉,即迫切的、...

3204
来自专栏Java架构沉思录

聊聊设计模式之单例模式(下)

前言 在之前的文章《聊聊设计模式之单例模式(上)》中,笔者为大家介绍了单例模式的几种常见的实现方式,并列举了各种实现方式的优缺点。在该文章的最后,笔者指出传统...

26710
来自专栏肖洒的博客

java本地文件操作

1073
来自专栏Java技术

Java设计模式--单例模式!

在介绍单例模式之前,我们先了解一下,什么是设计模式? 设计模式(Design Pattern):是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总...

561
来自专栏李家的小酒馆

IO基础内容(File)

JavaIO基础内容 IO技术概述 Output 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 Input 把持久设备上的数据读取到内...

1930
来自专栏程序员互动联盟

【编程基础】C语言FILE结构体以及缓冲区深入探讨

在C语言中,用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 定义文件指针的一般形式为: FILE *...

3607

扫码关注云+社区