写点什么

程序的机器级表示 - 算术与逻辑运算

用户头像
引花眠
关注
发布于: 2020 年 08 月 02 日

算术与逻辑运算

以下介绍的都是x86-64的整数与逻辑指令。大 部分的操作其实都是一类指令,这些指令大多都有不同大小操作数的变种,比如:addb,addw,addl,addq,这四个都是加法指令,分别操作字节,字,双字,四字。 提到算术运算,肯定会想到加减乘除这四种运算,在汇编语言中也同样存在这四种运算的操作,当然在C或Java语言中的一些操作比如自增、左移、右移等都是有的,其中有的操作数只有一个有的操作数有两个。 逻辑运算有与、或、异或等。



一元操作

一元操作的源与目的都是同一个位置,所以可以是寄存器或内存,但是不能是立即数。 算术的一元操作有:



  1. inc 格式: inc D; 自增,类似C语言中的i++

  2. dec 格式: dec D; 自减,类似C语言中的i–

  3. nec 格式: nec D; 取负,-D



逻辑的一元操作有: 2. not 格式: NOT D; 按位求反,C语言:~



二元操作

二元操作中,第二个操作是目的,第一个操作数是源,所以SUB S,D,表示D-S->D,所以第一个操作数可以是寄存器、内存和立即数,但是第二个操作数只能是寄存器或内存。



算术的二元操作有:



  1. add 格式: add S,D; 加法,D+S->D

  2. sub 格式: SUB S,D; 减法,D-S->D

  3. imul 格式: IMUL S,D; 乘法,D*S->D



逻辑的二元操作有:



  1. AND 格式: AND S,D; 对两个操作数实现按位逻辑与运算,D&S->D,C语言中的&,0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1

  2. OR 格式: OR S,D; 对两个操作数的按位‘或’运算,D|S->D,C语言中的|, 0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1

  3. XOR 格式: XOR S,D; 实现两个操作数按位异或运算,D^S->D,C语言中的^,0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0



移位操作

移位运算用来将整型为二进位信息串作整体移动。有两类运算符: << (左移) 和 >> (右移)。移位的位数可以是立即数或在%cl寄存器中,而目的操作数可以是寄存器或内存的位置。



左移操作有两个,其效果都是一样的,左移时,空出的右端用0补充,左端移出的位的信息就被丢弃。在二进制数运算中,在信息没有因移动而丢失的情况下,每左移1位相当于乘2:



  1. SAL 格式:SAL k,D; 算术左移

  2. SHL 格式:SHL k,D; 逻辑左移



右移操作有两个,其效果就不一样了:



  1. SAR 格式:SAR k,D; 算术右移,空出的右端用符号位补充,相当于除2

  2. SHR 格式:SHR k,D; 逻辑右移,空处的右端用0补充



参考资料

  1. 百度百科-机器语言

  2. 百度百科-汇编语言

  3. 豆瓣-深入理解计算机系统(原书第3版)



发布于: 2020 年 08 月 02 日阅读数: 59
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
程序的机器级表示-算术与逻辑运算