(3)算术运算指令

算术运算指令是反映CPU计算能力的一组指令,也是编程时经常使用的一组指令。它包括:加、减、乘、除及其相关的辅助指令。

该组指令的操作数可以是8位、16位和32位(80386+)。当存储单元是该类指令的操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。

1、加法指令 

(a)加法指令ADD(ADD Binary Numbers Instruction)

指令的格式:ADD Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是把源操作数的值加到目的操作数中。

(b)带进位加指令ADC(ADD With Carry Instruction)

指令的格式:ADC Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。

(c)加1指令INC(Increment by 1 Instruction)

指令的格式:INC Reg/Mem

受影响的标志位:AF、OF、PF、SF和ZF,不影响CF

指令的功能是把操作数的值加1。

(d)交换加指令XADD(Exchange and Add)

指令的格式:XADD Reg/Mem, Reg ;80486+

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是先交换两个操作数的值,再进行算术“加”法操作。

例5.3 已知有二个32位数d1和d2(用数据类型DD说明),编写程序片段把d2的值加到d1中。

解:32位数d1和d2在内存中如下所示。

方法1:用16位寄存器编写程序

MOV AX, word ptr d1 ;由于d1是双字类型,必须使用强制类型说明符。以下同。

MOV DX, word ptr d1+2 ;(DX,AX)构成一个32位数据

ADD AX, word ptr d2 ;低字相加

ADC DX, word ptr d2+2 ;高字相加。在低字相加时,有可能会产生“进位”

MOV word ptr d1, AX ;低字送给d1的低字

MOV word ptr d1+2, DX ;高字送给d1的高字

方法2:用32位寄存器编写程序

MOV EAX, d1

ADD EAX, d2

MOV d1, EAX

从上面两段程序不难看出:用32位寄存器来处理32位数据显得简单、明了,而16位微机虽然也能处理32位数据,但做起来就要复杂一些。

2、减法指令

(a)减法指令SUB(Subtract Binary Values Instruction)

指令的格式:SUB Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是从目的操作数中减去源操作数。(前面减去后面)

(b)带借位减SBB(Subtract with Borrow Instruction)

指令的格式:SBB Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是把源操作数和标志位CF的值从目的操作数中一起减去。

(c)减1指令DEC(Decrement by 1 Instruction)

指令的格式:DEC Reg/Mem

受影响的标志位:AF、OF、PF、SF和ZF,不影响CF

指令的功能是把操作数的值减去1。

(d)求补指令NEG(Negate Instruction)

指令的格式:NEG Reg/Mem

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能:操作数=0-操作数,即改变操作数的正负号。

例5.4 已知有二个32位数d1和d2,编写程序片段从d1中减去d2的值。

解:

方法1:用16位寄存器编写程序

MOV AX, word ptr d1 ;取低字

MOV DX, word ptr d1+2 ;取高字,(DX,AX)构成一个32位数据

SUB AX, word ptr d2 ;低字相减

SBB DX, word ptr d2+2 ;高字相减。在低字相减时,有可能会产生“借位”

MOV word ptr d1, AX ;低字送给d1的低字

MOV word ptr d1+2, DX ;高字送给d1的高字

方法2:用32位寄存器编写程序

MOV EAX, d1

SUB EAX, d2

MOV d1, EAX

3、乘法指令

计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。

乘法指令的被乘数都是隐含操作数,乘数在指令中显式地写出来。CPU会根据乘数是8位、16位,还是32位操作数,来自动选用被乘数:AL、AX或EAX。

指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。

(a) 无符号数乘法指令MUL(Unsigned Multiply Instruction)

指令的格式:MUL Reg/Mem

受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)

指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按表5.2的对应关系存放。

(b) 有符号数乘法指令IMUL(Signed Integer Multiply Instruction)

指令的格式: IMUL Reg/Mem

IMUL Reg, Imm ;80286+

IMUL Reg, Reg, Imm ;80286+

IMUL Reg, Reg/Mem ;80386+

受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)

1)指令格式1——该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表5.2的对应关系存放。

2)指令格式2——其寄存器必须是16位/32位通用寄存器,其计算方式为:

Reg ← Reg × Imm

3)指令格式3——其寄存器只能是16位通用寄存器,其计算方式为:

Reg1 ← Reg2×Imm 或 Reg1 ← Mem×Imm

4)指令格式4——其寄存器必须是16位/32位通用寄存器,其计算方式为:

Reg1 ← Reg1×Reg2 或 Reg1 ← Reg1×Mem

在指令格式2~4中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。

4、除法指令

除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。

除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。

(a) 无符号数除法指令DIV(Unsigned Divide Instruction)

指令的格式:DIV Reg/Mem

指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表5.3的对应关系存放。指令对标志位的影响无定义。

(b) 有符号数除法指令IDIV(Signed Integer Divide Instruction)

指令的格式:IDIV Reg/Mem

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表5.3。

5、类型转换指令

在作有符号除法时,有时需要把短位数的被除数转换成位数更长的数据类型。比如,要用BL中的数据去除AL,但根据除法指令的规定:除数是8位,则被除数必须是AX,于是就涉及到AH的取值问题。

为了方便说明,假设:(AH)=1H,(AL)=90H=-112D,(BL)=10H。

1)、在作除法运算前,必须处理AH的原有内容

假设在作除法时,不管AH中的值,这时,(AH、AL)/BL的商是19H,但我们知道:AL/BL的商应是-7,这就导致:计算结果不是所预期的结果,所以,在作除法运算前,程序员必须要处理AH中的值。

2)、作无符号数除法时

可强置AH的值为0,于是,可得到正确的结果。

3)、作有符号数除法时

如果强置AH为0,则AX=0090H,这时,AX/BL的商为9,显然结果也不正确。

如果把AL的符号位1,扩展到AH中,得:AX=0FF90H=-112D,这时,AX/BL的商就是我们所要的正确结果。

综上所述,因为在进行有符号数除法时存在隐含操作数数据类型转换的问题,所以,系统提供了四条数据类型转换指令:CBW、CWD、CWDE和CDQ。

(a)字节转换为字指令CBW(Convent Byte to Word)

指令的格式:CBW

该指令的隐含操作数为AH和AL。其功能是用AL的符号位去填充AH,即:当AL为正数,则AH=0,否则,AH=0FFH。

指令的执行不影响任何标志位。

(b)字转换为双字指令CWD(Convent Word to Doubleword)

指令的格式:CWD

该指令的隐含操作数为DX和AX,其功能是用AX的符号位去填充DX。指令的执行不影响任何标志位。

(c)字转换为扩展的双字指令CWDE(Convent Word to Extended Doubleword)

指令的格式:CWDE ;80386+

该指令的隐含操作数为DX和AX,其功能是用AX的符号位填充EAX的高字位。指令的执行不影响任何标志位。

(d)双字转换为四字指令CDQ(Convent Doubleword to Quadword)

指令的格式:CDQ ;80386+

该指令的隐含操作数为EDX和EAX,指令的功能是用EAX的符号位填充EDX。指令的执行不影响任何标志位。

例5.5 编写程序段,完成下面计算公式,并把所得的商和余数分别存入X和Y中(其中:A,B,C,X和Y都是有符号的字变量)。

(C - 120 + A*B) / C

解:

A DW ?

B DW ?

C DW ?

X DW ?

Y DW ?

MOV AX, C

SUB AX, 120D ;书写指令“ADD AX, -120D”也可以

CWD

MOV CX, DX

MOV BX, AX ;(CX, BX)←(DX, AX),调度寄存器,为作乘法准备必要的寄存器

MOV AX, A

IMUL B ;(DX, AX)←A*B

ADD AX, BX ;计算32位二进制之和,为作除法作准备

ADC DX, CX

IDIV C ;AX是商,DX是余数

MOV X, AX ;分别保存商和余数到指定的字变量单元里

MOV Y, DX

汇编语言--微机CPU的指令系统(五)(算术运算指令)的更多相关文章

  1. 汇编语言--微机CPU的指令系统(五)(数据传送指令)

    五.微机CPU的指令系统 1.汇编语言指令格式 汇编语言的指令格式如下: 指令助忆符 [操作数1 [, 操作数2 [, 操作数3]]] [;注释] 指令助忆符体现该指令的功能,它对应一条二进制编码的机 ...

  2. 汇编语言--微机CPU的指令系统(五)(比较运算指令)

    (7)比较运算指令 在程序中,我们要时常根据某个变量或表达式的取值去执行不同指令,从而使程序表现出有不同的功能.为了配合这样的操作,在CPU的指令系统中提供了各种不同的比较指令.通过这些比较指令的执行 ...

  3. 汇编语言--微机CPU的指令系统(五)(转移指令)

    (9)转移指令 转移指令是汇编语言程序员经常使用的一组指令.在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所 ...

  4. 汇编语言--微机CPU的指令系统(五)(循环指令)

    (8)循环指令 循环结构是程序的三大结构之一.为了方便构成循环结构,汇编语言提供了多种循环指令,这些循环指令的循环次数都是保存在计数器CX或ECX中.除了CX或ECX可以决定循环是否结束外,有的循环指 ...

  5. 汇编语言--微机CPU的指令系统(五)(移位操作指令)

    (5) 移位操作指令 移位操作指令是一组经常使用的指令,它包括算术移位.逻辑移位.双精度移位.循环移位和带进位的循环移位等五大类. 移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的 ...

  6. 汇编语言--微机CPU的指令系统(五)(字符串操作指令)

    (11)字符串操作指令 字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的.字符串操作指令可对内存单元按字节.字或双字进行处理,并能根据操作对象的 ...

  7. 汇编语言--微机CPU的指令系统(五)(条件设置字节指令)

    (10)条件设置字节指令 条件设置字节指令(Set Byte Conditionally)是80386及其以后CPU所具有的一组指令.它们在测试条件方面与条件转移是一致的,但在功能方面,它们不是转移, ...

  8. 汇编语言--微机CPU的指令系统(五)(位操作指令)

    (6) 位操作指令 1.位扫描指令(Bit Scan Instruction) 指令的格式:BSF/BSR Reg, Reg/Mem ;80386+ 受影响的标志位:ZF 位扫描指令是在第二个操作数中 ...

  9. 汇编语言--微机CPU的指令系统(五)(标志位操作指令)

    (2)标志位操作指令 标志位操作指令是一组对标志位置位.复位.保存和恢复等操作的指令. 1.进位CF操作指令 Ø 清进位指令CLC(Clear Carry Flag):CF←0 Ø 置进位指令STC( ...

随机推荐

  1. 了解Serverless架构

    1 概述 Serverless中文译为“无服务”是一种新兴起的架构模式,公司ESB产品引入Rest微服务服务机制过程,笔者刚好参与其中,其中Serverless作为一个新起的概念,跟微服务架构相关,为 ...

  2. PHP调用百度天气接口API

    //百度天气接口API $location = "北京"; //地区 $ak = "5slgyqGDENN7Sy7pw29IUvrZ"; //秘钥,需要申请,百 ...

  3. Oracle的条件in包含NULL时的处理

    一.创建一个含表,表中只有一列为id,该列中含有值为NULL的记录 我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面 ...

  4. Docker学习之3——容器

    容器(Container) 容器介绍: docker是通过容器来运行业务的,就像运行一个kvm虚拟机是一样的.容器其实就是从镜像创建的一个实例. 我们可以对容器进行增删改查,容器之间也是相互隔离的.和 ...

  5. 我对开源C++网络库简单应用总结

    网上有篇文章<开源免费的C/C++网络库(c/c++ sockets library) 七剑下天山>,看了之后觉得每个库都不错,这里我具体下载这些库看一下,简单总结一下: 顺便添加一些我找 ...

  6. Chapter 4 Invitations——7

    The next day, I was surprised that Jessica wasn't her usual gushing self in Trig and Spanish. 第二天,我很 ...

  7. 如何使用借助python完成 ARCGIS工具箱的调用

    上个月使用python调用arcgis工具箱完成了火点txt文件转shp文件的小功能, 感觉很不错, 写下这篇博客希望对大家有所帮助. 1.环境介绍: 系统: win8.1(64位) arcgis:d ...

  8. DHCP服务器的搭建

    dhcp笔记整理:http://services.linuxpanda.tech/DHCP/index.html 1 dhcp简介 DHCP原理 动态主机配置协议(Dynamic Host Confi ...

  9. kubernetes之收集集群的events,监控集群行为

    一.概述 线上部署的k8s已经扛过了双11的洗礼,期间先是通过对网络和监控的优化顺利度过了双11并且表现良好.先简单介绍一下我们kubernetes的使用方式: 物理机系统:Ubuntu-16.04( ...

  10. TensorFlow的图切割模块——Graph Partitioner

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在经过TensorFlow的Placer策略模块调整之后,下一步就是根据Pla ...