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

1、leal 指令
leal 指令也称为加载有效地址(load effective address)指令,它实际上是 movl 指令的变形。它的指令形式是从存储器读数据到寄存器,但实际上它根本没有引用存储器。
它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读取数据,而是将有效地址写入到目的操作数,类似于 C 语言的取地址操作符“&”。另外就是作普通的算术运算。
leal 立即数,寄存器
这类指令就是将立即数装载至寄存器,比如 leal 0𝑥01,0×01,%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而已,它并不对存储器进行引用的值的计算。
为了更好的表示这条指令的效果,这里简单的画个图来表示这一过程。我们假设下图是执行指令之前,寄存器和存储器的状态。



此外,它还可以简单的描述普通的算术操作,比如假如寄存器 %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 指令
这一组指令格式如下:

第一个操作数可以是立即数、寄存器或存储器,第二个操作数可以是寄存器或存储器位置。不过和 movl 指令一样,两个操作数不能同时是存储器位置。
4、SAL、SHL、SAR、SHR 指令
移位操作,指令格式如下:

移位的目的操作数可以是一个寄存器或是一个存储器位置。
今天的文章深入理解计算机系统(3.4)——算术和逻辑操作分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16770.html