第4章 80x86指令系统

4.180868088指令系统

    计算机是通过执行指令序列来完成用户的特定任务的,因此每种计算机都有一组指令集供用户使用。这组指令集就称为计算机的指令系统

4.1.1 8086/8088指令编码格式

计算机是通过执行指令来处理各种数据的,因此,一条指令既要指出如何处理数据,同时还应指出数据的来源、操作结果的去向。


如何寻找操作数(即操作对象),这就是指令的寻址方式,它是由指令编码格式指出的。   

    80868088指令系统采用变字长的指令编码格式,其指令可由16个字节组成,它包括操作码(第一字节),寻址方式(第二字节),位移量、立即数(第三到第六字节)三部分组成。其中,寻址方式、位移量、立即数为操作数部分。







指令按所含的操作数的个数分为四种形式:
无操作数
              hlt ,ret
单操作数:可以是源操作数,也可以是目的操作数。
             Push ax,  pop bx
双操作数:一个是源操作数,一个是目的操作数。
              Add ax, bx
隐含操作数:可能隐含一个操作数(源或目的),也可能隐含两个操作数。
               mul bl

4.1.2  8086/8088指令系统的寻址方式

所谓寻址方式就是寻找操作数存放地址(位置)的方法。

8086/8088系统中,操作数又可分为两大类:数据操作数和地址操作数。因此,寻址方式也分为数据寻址方式和地址寻址方式两大类。

    数据操作数 指令中操作的对象是数据

        movax, 1234h;  add albl

    地址操作数 程序转移指令 中的操作数,指令中操作的对象是地址。

         jmp0020h

1. 数据操作数


8086/8088 系统中 操作数存放的位置 有以下 4 种:
⑴操作数包含在指令字节中。即指令格式中操作数部分就是操作数本身。这种操作数叫 立即数操作数
⑵操作数存放在 CPU 的某个内部寄存器中。这种操作数叫 寄存器操作数
⑶操作数在内存的数据区中。这种操作数叫 存储器操作数
⑷操作数来自或送到 I/O 端口。这种操作数叫 I/O 操作数

2. 地址操作数

  地址寻址方式
段内直接寻址
段内间接寻址
段间直接寻址
段间间接寻址


3. 寻址方式


1 、立即数(常数)
取值范围如下表:
 

8

16

无符号数

00H-FFH(0-255)

0000H-FFFFH(0-65535)

带符号数

80H-7FH(-128~127)

8000H-7FFFH

(-32768~32767)

立即数只能用作源操作数,如

MOV    AX0FA00H ;正确

MOV    8000HAX ;错误


2 、寄存器操作数

放在8通用寄存器4段寄存器中的操作数



3 、存储器操作数

例子:在数据段中定义[1000h]为字节类型

  moval, [1000h]

            movbx, WORD PTR[1000h]

            一般不允许两个操作数同时为存储器操作数

           mov [1000h], [2000h]    ;错误

    存储器寻址方式的操作数存放在存储器单元中。因此,要存取操作数就必须知道其存储器的单元地址。在指令中可以直接给出或间接给出操作数的地址,以达到存取操作数的目的。

    指令中给出的地址只是操作数的有效地址(EA),并且是放在方括号([ ])中。若要从存储器中存取操作数还须得到实际的地址(物理地址)。

    物理地址=段地址左移四位+有效地址


存储单元的物理地址=段基地址+偏移地址

Ø 若指令中没有指明所涉及的段寄存器, CPU 就采用默认的段寄存器来确定操作数所在的段

存储器操作数的偏移地址(也称有效地址)可以通过不同的寻址方式由指令给出

例如,若(BX)=2000H, (SI)=0A00H, (DI)=2A00H,则以下指令的结果是一样的:

  MOV AL, [2A00H]

  MOV  AL, [BX+0A00H]

  MOV  AL, [BX][SI]

  MOV  AL, [DI]

   

   有效地址可以由以下三种地址分量组成:

v 位移量 :它是存放在指令中的一个 8 位或 16 位的带符号数。
v 基 :它是存放在基址寄存器 BX BP 中的内容。
v 变 :它是存放在变址寄存器 SI DI 中的内容。

   对于某条具体指令,这三个地址分量可有不同的组合。正是因为这三种地址分量有不同的组合,才使得对存储器操作数的寻址产生了若干种不同的方式。

存储器寻址方式

直接寻址方式

MOV  AL,  [1064H]

EA16disp


寄存器间接寻址

   MOV  AX, [SI]

   MOV  [BX], AL

        (BX)

EA= (DI)

        (SI)


寄存器相对寻址


基址加变址寻址方式


基址加变址相对寻址


4I/O端口寻址方式


访问端口的地址时,用 AB 的低 16 根,端口地址可以是 8 位或者是 16 位。
当端口地址大于 0FFH 时,必须将该地址先送到 DX 寄存器中,然后进行输入输出。

直接端口寻址方式

  IN  AL, 21H

此指令表示从地址为21H的端口中读取数据送到AL中。


间接端口寻址方式

mov dx,120h

out dx,al

    前一条指令将端口地址120H送到DX寄存器,后一条指令将al中的内容输出到地址有dx寄存器内容所指定的端口中.。


地址寻址方式


1)段内直接寻址

转移的地址是当前 IP 内容和指令规定的 8 位或 16 位位移量之和。
当位移量是 8 位时,称为 短转移 ;位移量是 16 位时称为 近转移

例如:
JMP  NEXT
JMP  SHORT ABC
JMP  NEAR  PTR  NEXT

  这种寻址方式适用于条件转移或无条件转移类指令。但条件转移只有 8 位位移量的短转移。

例:JMP  SHORT ABC

假设:(CS)2000H(IP)1002H


2)段内间接寻址方式

程序转移的地址存放在 寄存器 存储器单元 中。指令执行使用寄存器或存储器单元的内容来更新 IP 的内容。
例如:
JMP  BX
JMP  WORD PTR  ADDR

例:JMP WORD PTR ADDR

当前(CS)2000H(IP)1002HADDR2700H


例:JMPWORD PTR [BX]

设当前 (CS) 1500H,(IP) 1200H,

(BX)0100H,(DS)1000H,

(10100H)00H(10101H)27H

则存储转移偏移地址的内存单元地址为:

(DS) ×10H +(BX) 10000H+0100H

      10100H


执行完这条指令后, IP 的内容变成 2700H CPU 将转移到存储单元 17700H 去执行程序。

PA 15000H+2700H 17700H

3段间直接寻址方式

这种寻址方式是指令码中直接给出16位的段地址和16位的偏移地址用来更新当前的CSIP内容。



4)段间间接寻址方式

   这种寻址方式是由指令码的寻址方式字节求出存放转移地址的连续两个字的地址。其低位字地址单元中存放的是偏移地址,高位字地址单元中存放的是转移段地址。


 例:JMPDWORD PTR DELTA[BX]

    本例指令是无条件转移指令,采用段间间接寻址方式。

    设当前(CS)2000H,(IP)0100H,(DS)1000H(BX)3000H,DELTA0040H,(13040H)00H,(13041H)50H,(13042H)00H,(13043H)30H,则间接存储地址按寄存器相对寻址为:

    (DS)左移4+(BX)+DELTA10000H+3000H+0040H

                          13040H

于是,可得转移地址为:

    3000H:5000H

即转移物理地址为:

    PA30000H+5000H35000H

    执行本指令后,CS的内容和IP的内容分别变成3000H5000H,程序转移到存储单元35000H开始执行。


4.1.3  8086/8088指令系统

8086/8088指令系统大致可分为六大类指令:

(1)数据传送类;
(2)算术运算类;
(3)逻辑运算和移位;
(4)串操作;
(5)控制转移类;
(6)处理器控制。

1.数据传送类指令

  数据传送指令的主要功能是传送数据、地址和标志。可分为通用数据传送指令、输入输出指令、地址传送指令和标志传送指令。

   (1)通用数据传送指令

  通用数据传送指令可完成字节或字数据的传送。它可分为数据传送指令、堆栈操作指令、数据交换指令和字节转换指令。

  1)数据传送指令

    指令格式MOV dstsrc    (dst)(src)

src表示源操作数(/字节)

         立即数操作数

         寄存器操作数(包括段寄存器)

         存储器操作数

dst表示目的操作数(/字节)

    寄存器操作数(不包括IP,CS段寄存器)

    存储器操作数

指令功能:将源操作数传送(复制)到目的操作数。

    传送方向:如下图所示。


mov 注意:
1. dst 不能是立即数
2. dst 不能是 cs ip
3. src 不能是 ip
4. 传送的两个数据,类型一定要一致
5. 不能直接段 R ß imm
6. 不能直接段 R ß R
7. 不能直接存储器 ß 存储器
mov 指令的正误判断
1.MOV AL, 050AH

错误。类型不匹配

movax,050ah

2.MOV SI, DL

错误。类型不一致

movdh,0

movsi,dx

3. MOV [BX+SI], 01H 

错误。类型不明确

movbyte ptr[bx+si],01h

byte ptr说明是字节操作

movword ptr[bx+si],01h

word ptr说明是字操作

4. MOV buf2, buf1

错误。不能直接在存储器之间传送

假设buf2buf1是两个字变量

movax,buf1

movbuf2,ax

假设buf2buf1是两个字节变量

moval,buf1

movbuf2,al

5. MOV DS, ES

错误。不能直接在段寄存器之间传送

movax,es

movds,ax

6. MOV DS, 100H

错误。不能由立即数直接到段寄存器

movax,100h

movds,ax

7. Mov cs , 1234h

错误。cs不能被mov修改

    2) 堆栈操作指令

堆栈是一个 后进先出 FILO (或说 先进后出 FILO )的主存区域,位于堆栈段中; SS 段寄存器记录其段地址。

堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器 SP 指定。

堆栈段是程序中不可或缺的一个内存区,常用来

临时存放数据
传递参数
保存和恢复寄存器

    ① 压入堆栈指令

    指令格式及操作:

        PUSH  src   ;(SP)←(SP)-2,

                    ;((SP)+1:(SP))←(src)

src表示源操作数()

         寄存器操作数(包括段寄存器)

         存储器操作数

弹出堆栈指令

    指令格式及操作:

         POP dst  ;(dst)←((SP)+1:(SP)),

                    ;(SP)←(SP)+2

dst表示目的操作数()

    寄存器操作数(不包括IP,CS段寄存器)

    存储器操作数

注意:堆栈指令的操作数只能是字操作数(即16位操作数),且不能是立即数。

    进栈操作(PUSH):先移后进

    出栈操作( POP):先出后移        


push pop 注意:

1. 不能操作立即数
2. 只能操作字
3. 可以操作存储器操作数
4. cs 可以被 push ,但不能被 pop
Push pop 指令的正误判断
1. push ax

正确

2. push[2000h]

如果定义了[2000h]存放的是操作数字类型,则正确,否则错误

3. pop  [ si ]

如果定义了[si]存放的是操作数字类型,则正确,否则错误

4. pop word ptr wvar

正确

5. push 1234h

错误。不能操作立即数

6. pop 1234h

错误。不能操作立即数

7. push ah

错误。不能操作字节操作数

8. pop cs

错误。不能由pop改变cs

    3)交换指令

    指令格式及操作:

        XCHG  opr1,opr2 ;(opr1)←→(opr2)

     Xchg将两个地方的数据进行互换。

     交换的两个数据可以是8位的,也可以是16位的。

xchg 注意

1. 两个操作数为 R 或者是 MM
2. 不能都是存储器
3. 不能是段寄存器
4. 源、目的操作数类型一致,可以同是字或字节

xchg 指令应用举例

1. mov ax,1199h 

  xchg ah,al         ax=9911h

2. mov wvar,5566h wvar 是一个字变量

  xchg ax,wvar    ;交换后ax=5566hwvar=9911h

3. xchg al,byte ptr wvar+1

ax=5599hwvar=6611h

;“byteptrwvar+1”强制为字节量

;只取高字节与AL类型交换

;否则数据类型不匹配

4)字节转换指令(又称:查表指令)

指令格式及操作:

   XLAT  src_table;(AL) ←((BX)+(AL))

XLAT指令是用来将一种字节代码转换成另一种字节代码。即将BX的内容(代码表格首址src_table)和AL的内容(表格偏移量)相加作为有效地址。并从中读出此内存表格地址单元的内容传送到AL累加器中。

XLAT指令还可以有以下几种表示形式:

XLAT          ;不写操作数

XLATB         ;B就不允许再写操作数。

XLAT  ES:src_table ;重设段寄存器为ES

[例]在内存的数据段有一张16进制数的ASCII码表,其首地址为Hex_table,如下图所示,为欲将十六进制数0AH转换成ASCII码,则可用以下几条指令实现:

MOV  BX, OFFSET  Hex_tale (BX)←表首址

MOV  AL, 0AH             (AL)←十六进制数A

XLAT  Hex_table ;查表转换


xlat 注意:

1. mov bx , offset table  ;不写 offset 错误

  上句等价于:lea bx, table

2. xlatb 不允许再写操作数
3. 允许段超越, xlat   es:table

    (2) 输入/输出指令

    输入输出指令可以分为两大类:一类是直接端口地址的输入/输出指令;一类是通过DX寄存器间接端口地址的输入/输出指令。


 1) 输入指令

    ① 直接寻址的输入指令

    指令格式及操作:

        IN acc,port    ;(acc)←(port)

    其中:acc8位或16位累加器AL/AXport8位端口地址,故可寻址256个端口。

 

②间接寻址的输入指令

    指令格式及操作:

        IN acc,DX     ;(acc)←((DX))

    其中:acc8位或16位累加器AL/AXDX16位间接寻址的端口地址寄存器,故可寻址64K个端口。

 2) 输出指令

    ① 直接寻址的输出指令

    指令格式及操作:

        OUT port, acc;(port)←(acc)

    间接寻址的输出指令

    指令格式及操作:

        OUT DX, acc;(DX)←((acc))

(3)地址传送指令

1)取有效地址指令

指令格式:

    LEA  reg16, mem

此指令的功能是将存放源操作数的16位偏移地址(即有效地址EA)送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个寄存器操作数。例如:

LEA  BX, buffer

LEA  AX, [BP][DI]

LEA  DX,  bety[BX][SI]

    注意LEA指令和MOV指令的异同,比较下面两组指令:

不同:LEABX,buffer ;将存储器buffer的偏

                      移地址送到BX

      MOV BX,buffer ;将存储器buffer的内

      容传送到BX

相同:LEA  BX,buffer 

      MOV BX,OFFSET buffer

    以上两条指令都是将存储器buffer的偏移地址送到BX。其中OFFSETbuffer表示存储器偏移地址。

2)地址指针装入DS指令

指令格式:

    LDS  reg16,mem32

此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入DS,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如:

  LDS DI,[2130H]


3)地址指针装入ES指令

指令格式:

    LES  reg16,mem32

此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入ES,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如:


(4) 标志传送指令

1)取标志指令

指令格式:LAHF

2)置标志指令

指令格式:SAHF


3)标志压入堆栈指令

指令格式及操作:

     PUSHF   ;(SP)←(SP)-2,

    ((SP)+1;(SP))←(FLAG)

4)标志弹出堆栈指令

指令格式及操作:

     POPF    ;(FLAG)←((SP)+1;(SP)),

              (SP)←(SP)+2

   在使用这些传送类指令时应注意以下几点:

    ① 目的操作数不能为立即数。

    ② 目的操作数为段寄存器(CS不能作为目的操作数),源操作数不能为立即数。

    ③ 两操作数不能同时为存储器操作数。

    ④ 操作数类型必须一致。(字/字节)

    ⑤ 用BXSIDI来间接寻址时,默认的段寄存器为DS;用BP来间接寻址时,默认的段寄存器为SS,在串操作里,DI默认段寄存器为ES

    对于堆栈操作,操作数不能为立即数;CS寄存器的值可以push,但不能pop

    ⑦ 数据交换指令的两个操作数任一都不能是立即数。

    ⑧ 查表指令的操作数是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL

    ⑨ 除了SAHFPOPF指令外,其余指令都不会影响标志位

判断下列指令的正误:

1. MOV   DS, 1200H

错误。不能用立即数mov到段寄存器

2. XCHG AL, BX

错误。交换的R类型不一样

3. OUT    120H, AL

错误。输出端口>0FFH,要用dx间接

4. MOV   AL, [BX][BP]

错误。用的2个基址寄存器

5. OUT    DX, AL

正确

6. PUSH  1234H

错误。不能push立即数

7. POP     BL

错误。Pop不能操作字节型操作数

     2、算术运算类指令

80868088有丰富的算术运算指令,而且可以处理4种类型的数据,如下表所示:

数据类型

数据范围

运算

可作累加器使用的寄存器或存储器

8位无符号

0~255

加减

所有的通用寄存器或存储器

乘除

AX寄存器

16位无符号

0~65535

加减

所有的通用寄存器或存储器

乘除

AXDX寄存器

8位带符号

128~127

加减

所有的通用寄存器或存储器

乘除

AX寄存器

16位带符号

32768~+32767

加减

所有的通用寄存器或存储器

乘除

AXDX寄存器

压缩型BCD

0~99

加减

AX寄存器

非压缩型BCD

0~9

加减

AX寄存器

乘除

AX寄存器

    (1)加法指令

指令格式

操作功能

标志位影响

O

S

Z

A

P

C

ADD  dst,src

(dst) ←(dst)+(src)

ADC  dst, src

(dst) ←(dst)+(src)+(CF)

INC  dst

(dst) ←(dst)+1

×

AAA

非压缩型BCD码调整指令

ASCII码调整指令)

DAA

压缩型BCD调整指令

×

:影响; ×:不影响

△:状态不定;1:置为1

    在微处理器中,没有专用的BCD码运算指令,使用二进制运算指令进行BCD码数的运算,然后用BCD码运算调整指令进行调整,重新得到BCD码的结果。

 DAA指令的操作为:(压缩型BCD码调整)

    如果  (AL)∧0FH>9(AF)1

    则  (AL)←(AL)06H 

  (AF)←1

    如果  (AL)>9FH(CF)1

    则  (AL)←(AL)60H  

  (CF)←1

AAA指令的操作为:(非压缩型BCD码调整)

    如果  (AL)∧0FH>9(AF)1

    则  (AL)←(AL)06H 

  (AH)←(AH)1

  (AF)←1

  (CF)←(AF)

  (AL)←(AL)∧0FH

    否则  (AL)←(AL)∧0FH

[例]要求计算两个十进制数之和,78=?。可用以下指令实现:(DAA,压缩型BCD码调整)

MOV  AX, 0007H  ;(AL)=07H,(AH)=00H

MOV  BL, 08H  ;(BL)=08H

ADD  AL, BL  ;(AL)=0FH

DAA  ;(AL)=15H,(AH)=00H  ;(CF)=0,(AF)=1

(AAA,非压缩型BCD码调整)

MOV  AX, 0007H  ;(AL)=07H,(AH)=00H

MOV  BL, 08H  ;(BL)=08H

ADD  AL, BL  ;(AL)=0FH

AAA  ;(AL)=05H,(AH)=01H

  ;(CF)=(AF)=1

[例]要求计算两个十进制数之和,5634=?。可用以下指令实现:(压缩型BCD码调整)

MOV  AX, 3456H  ;(AL)=56H,(AH)=34H

ADD  AL, AH         ;(AL)=8AH

DAA  ;(AL)=90H

[例]要求计算两个BCD数的ASCII码之和,即59=?。可用以下指令实现:(ASCII码调整)

MOV  AL, 5  ;(AL)=35H

ADD  AL, 9  ;39H,(AL)=6EH

MOV  AH, 0   ;(AH)=00H

AAA  ;(AH)=01H,(AL)=04H

OR   AX,3030H  ;(AX)=3134H,34

  (2) 减法指令

指令格式

操作功能

标志位影响

O

S

Z

A

P

C

SUB  dstsrc

(dst) ←(dst)(src)

SBB  dst,  src

(dst) ←(dst)(src)(CF)

DEC  dst

(dst) ←(dst)1

×

NEG  dst

(dst) ←0 (dst)

1

CMP  dst, src

(dst) (src)

AAS

非压缩型BCD调整指令

DAS

压缩型BCD调整指令

×

DAS指令的操作为:(压缩型BCD码调整)

    如果  (AL)∧0FH>9,(AF)1

    则  (AL)←(AL)06H

  (AF)←1

    如果  (AL)>9FH(CF)1

    则  (AL)←(AL)60H

  (CF)← 1

AAS指令的操作为:(非压缩型BCD码调整)

    如果    (AL)∧0FH>9(AF)1

    则  (AL)←(AL)06H

  (AH)←(AH)1

  (AF)←1

  (CF)←(AF)

  (AL)←((AL) ∧ 0FH)

    否则  (AL)←((AL)∧ 0FH)

[例]要求计算两个十进制数之差,86-7=?。可用以下指令实现:(非压缩型BCD)

MOV  AX, 0806H  ;(AH)=08H,(AL)=06H

SUB  AL, 07H  ;(AX)=08FFH

AAS  ;(AX)=0709H

[例]要求计算两个十进制数之差,134-56=?。可用以下指令实现:(压缩型BCD)

MOV  AX, 5634H  ;(AH)=56H,(AL)=34H

SUB  AL, AH  ;(AL)=DEH,有借位

DAS  ;(AL)=78H

    (3) 乘法指令

指令格式

操作功能

标志位影响

O

S

Z

A

P

C

MUL  src

(AX) ← (AL) × (src)

(DX:AX) ← (AX) × (src)

×

×

×

×

IMUL  src

(AX) ← (AL) × (src)

(DX:AX) ← (AX) × (src)

×

×

×

×

AAM

BCD调整指令

×

×

×


MUL 注意:
1. 无符号数乘法;
2. 操作数只能为存储器或寄存器操作数;
3. 不能写两个操作数;
4. 如果乘积的高半部分( AH DX )为 0 ,则 OF = CF =0
5. 否则, OF = CF =1
6. IMUL 注意:
7. 如果乘积的高半部分仅仅是低半部分的符号位扩展,则( OF = CF =0
8. 否则, OF = CF =1

AAM指令的操作为:(将二进制数转换成十进制数)

  (AH)←(AL)/0AH的商;即AL除以10,商送AH

  (AL)←(AL)/0AH的余;即AL除以10,余数送AL

例:要求进行以下十进制乘法运算:7´9=?

    解:可编程序段如下:

        MOV  AL07H (AL)=07H

        MOV BL09H(BL)=09H

        MUL BL      (AX)=07H´09H=003FH

        AAM          (AH)=06H(AL)=03H

   (4)除法指令

指令格式

操作功能

标志位影响

O

S

Z

A

P

C

DIV  src

(AL) ← (AX)/(src)的商

(AH) ← (AX)/(src)的余数

(AX) ← (DX:AX) /(src)的商

(DX) ← (DX:AX) /(src)的余数

×

×

×

×

×

×

IDIV  src

(AL) ← (AX)/(src)的商

(AH) ← (AX)/(src)的余数

(AX) ← (DX:AX) /(src)的商

(DX) ← (DX:AX) /(src)的余数

×

×

×

×

×

×

CBW

(AL)<80H,(AH)←00H,

否则(AH)←FFH

CWD

(AX)<8000H,(DX)←0000H,

否则(DX)←FFFFH

AAD

BCD调整指令

×

×

    8086/8088CPU执行除法时规定:除数只能是的一半字长。当被除数为16位时,除数应为8位;当被除数为32位时,除数应为16位。


无符号数扩展:直接将要扩展的位补 0
带符号数扩展:
ü CBW ;( Byte à Word
AL 中的 8 位数据扩展成 16 位,放到 AX 中;
如果( AL = 正数,( AH ß 00H
如果 AL = 负数,( AH ß 0FFH
ü CWD ;( Word à Double Word
AX 中的 16 位数据扩展成 32 位,放到 DX AX 中;

AAD指令的操作为:(十进制数转换成二进制数)

   (AL)←(AH)´0AH+(AL)

   (AH)←0

例:要进行以下十进制除法运算:73÷2=?

    解:可编程序段如下:

        MOVAH07H (AH)=07H

        MOV AL03H (AL)=03H

        AAD    (AL)=49H(即十进制数73)

        MOV BL02H (BL)=02H

        DIV BL (AL)=24H(),(AH)=01H(余数)

        AAM     (AH)=03H(AL)=06H

BCD 调整指令

压缩型 BCD 码调整指令:

 DAADAS为加减调整,乘除没有调整指令。

非压缩型 BCD 码调整指令

   AAAAASAAMAAD,其中+,-,×调整是在运算之后进行调整,÷在运算之前调整。

    3.位操作类指令

   位操作指令是对8位或16位的寄存器或存储单元中的内容按位进行操作。这一类指令包括逻辑运算指令、移位指令和循环移位指令等三组。

    (1)逻辑运算指令

   逻辑运算类指令与算术运算指令不同,算术指令是按字节或字进行算术运算,而逻辑运算指令是把操作数按位来进行逻辑运算。


    说明:TEST相当于AND运算,但是不保存结果,仅影响标志。

常见的用法举例:

①清进位标志位:ANDAX,AXORAL,AL等,并且影响SFZFPF

②清零操作数:XORAX,AX不仅把AX清零,而且也影响了状态标志。

③把某几位取反:用XOR指令,把要取反的位和1异或,不变的位和0异或。

④清零或置位某几位:用AND指令清零,用OR指令置位。

(2)移位操作指令

该类指令的使用方法是:

①移动1位,用类似于SHLAX,1的格式

②移动n位,用类似于SHLAX,CL的格式


移位操作对OF的影响

如果移 1 位:
SHL/SAL :移位后 CF 与最高位不等,则 OF=1

SHR :移位后最高位与次高位不等,则 OF=1


SAR :移位后,符号位不会发生变化,所以 OF 恒为 0


如果移位次数大于 1 ,则 OF 值不确定。

eg:将一个16位无符号数乘以10。该数原来存放在num为首地址的两个连续的存储单元中。

乘法运算执行时间长,效率不高。

mov  ax, num

mov  bx,10

mul   bx

花费130个时钟周期

移位运算执行时间短,指令条数多。

mov  ax, num

shl    ax, 1

mov   bx,ax

shl    ax, 1

shl    ax, 1

add   ax, bx

hlt

花费约28个时钟周期

说明:

逻辑移位适用于无符号数,算术移位适用于带符号数;

SHL/SAL相当于无符号数乘法;

SHR相当于无符号数除法,SAR相当于带符号数除法;

SHLSAL的机器码完全相同,是助记符的两种写法。


说明:

  循环移位常用来变换数据格式。

循环移位操作对 OF 的影响

如果移 1 位:
ROL RCL :移位后 CF 与最高位不等,则 OF=1;

ROR RCR :移位后最高位与次高位不等,则 OF=1

如果移位次数大于 1 ,则 OF 值不确定。

    使用举例

    [例一]利用循环移位指令可以对寄存器或存储器中的任一位进行测试。如要测试AL寄存器中的第5位的状态是0还是1,则可利用以下  指令实现:

   MOV CL(CL)¬移位次数

   ROR ALCL (CF)¬AL的第5

   JNC ZERO  ;若(CF)=0,ZARO

     ...... ;否则......

  ZERO:  ......

    [例二]利用带进位循环移位指令可以实现将两个以上寄存器或存储器单元组合起来一起移位。如DXAX两个寄存器组成的32位数乘以2,可用以下两条指令实现:

SHLAX,1  AX左移1,(CF)¬AX的最高位

RCLDX,1  DX带进位左移1,DX的最低位¬(CF)

具体操作如下图:


       4.串操作指令

    串操作指令的特征是对数据块,也称数据串(字符串或数值串)进行操作。其操作数为隐含操作数,并且其中部分指令的两个操作数可以同时是存储器操作数。

    串传送  MOVS(Move string)

    串比较  CMPS(Compare string)

    串扫描  SCAS(Scan string)

    串装入  LODS(Load from string)

    串保存  STOS(Store in to string)

    特点:

    ⑴ 串操作指令需要指明每次操作的数据串数据的类型:B-表示字节串,W-表示字串。

    例如:MOVSB,CMPSW等。

    ⑵ 串操作指令使用DS:SI作为源操作数的指针,允许段超越;ES:DI作为目的操作数的指针,不允许段超越;

    ⑶ 使用DF来表示每次操作以后变址寄存器SIDI的变化方向:

    CLD;DF=0 SI,DI做增量变化B:+1W:+2

    STD ;DF=1 SI,DI做减量变化B:-1W:-2

    使用CX来表示用重复前缀以后指令需要重复执行的次数(通常是数据串的长度)

    ⑸通常使用重复前缀来自动完成一个数据块(数据串)的操作。

    重复前缀:

    REP重复

    REPE/REPZ相等/为零则重复

    REPNE/REPNZ不相等/不为零则重复

movs 串传送

[rep] mov dst_string , src_string ;每执行一次,进行的操作为:
1. ((ES):(DI))<-((DS):(SI))
2. (SI) <- (SI) ± 1 (DI)<- (DI) ± 1   字节操作

 (SI)<-(SI)±2(DI) <-(DI)±字操作

movs 之前要设置 DF
movs 两个操作数都是存储器, mov 的两个操作数不能同时为存储器
源操作数可以段超越: movs buf2, es:buf1
目的操作数只能在 es 段,不能段超越
movs 不影响标志位
lods 串装入
lods 每执行一次,进行的操作为:
1. (AL)/(AX)<- ((DS):(SI))
2. (SI) <- (SI) ±   (SI)<- (SI) ± 2
Lods 不影响状态标志位
Lods 一般不带 rep 前缀
stos 串送存
stos   dst_string ;每执行一次,进行的操作为:
1. ((ES):(DI))<-(AL)/(AX)
2. (DI) <- (DI) ±   (DI)<- (DI) ± 2
Lods 不影响状态标志位
如果加上 rep 前缀,则操作一直重复直到 (cx)=0
cmps 串比较
cmps   src_string , dst_string
1. ((DS):(SI)) ((ES):(DI))
2. (SI) <- (SI) ± 1 (DI)<- (DI) ± 1   字节操作

 (SI)<-(SI)±2(DI) <-(DI)±字操作

源在前,目的在后
如果加上 repe repz ,表示当 (cx) 不等于 0 ,且 ( zf )=1 时继续比较。即要找两个串中第一个相等的元素
scas 串扫描
scas   dst_string
1. (AL) ((ES):(DI)) (AX) ((ES):(DI))
2. (DI) <- (DI) ±   (DI)<- (DI) ± 2
不允许段超越
如果加上 repne repnz ,表示当 (cx) 不等于 0 ,且 ( zf )=0 时继续比较。即要找串中与 al 中相等的那个元素

指令格式

操作功能

标志位影响

O

S

Z

A

P

C

MOVS  Dstring,Sstring

MOVSB

MOVSW

((ES):(DI))<-((DS):(SI))

(SI) <-(SI)± (SI)<-(SI)±2

(DI) <-(DI)±1 (DI)<-(DI)±2

LODS  Sstring

LODSB

LODSW

(AL)/(AX) <- ((DS):(SI))

(SI) <-(SI)± (SI)<-(SI)±2

STOS  Dstring

STOSB

STOSW

((ES):(DI)) <- (AL)/(AX)

(DI) <-(DI)± (DI)<-(DI)±2

CMPS Sstring, Dstring

CMPSB

CMPSW

((DS):(SI))((ES):(DI))

(SI) <-(SI)± (SI)<-(SI)±2

(DI) <-(DI)±1 (DI)<-(DI)±2

SCAS  Dstring

SCASB

SCASW

(AL) ((ES):(DI))

(DI) <-(DEI)± (DI)<-(DI)±2

REP

MOVS

STOS

(CX)!=0

REPZREPE

REPNZREPNE

CMPS

SCAS

(CX)!=且 (ZF)1

(CX)!=且 (ZF)0

       5.控制转移类指令

    能够使程序的执行流程发生改变的指令

    (1)无条件转移指令

指令名称

指令格式

指令功能

转移范围

段内直接短转移

 JMP  disp8

 (IP)<-(IP)+ disp8

-128 ~ +127

段内直接近转移

 JMP  disp16

 (IP)<-(IP)+ disp16

-32K ~ +32K

段内间接转移

 JMP  mem/reg

 (IP) <- (mem)

 (IP) <- (reg)

-32K ~ +32K

段间直接转移

 JMP  addr

 (IP)<-偏移地址

 (CS) <-段地址

-32K ~ +32K

段间间接转移

 JMP  mem

 (IP) <- (mem)

 (CS) <- (mem)+2

-32K ~ +32K

    (2) 条件转移指令

   根据判断条件是否成立决定是否转移(即条件成立则转移,否则不转移)。按照判断条件的不同条件转移指令可分为以下类型:单个标志判断指令、无符号数判断指令、有符号数判断指令和CX寄存器判断指令。

    条件转移都是段内直接短转移,即(IP)=(IP)+Data8类型的转移。



    (3) 循环控制指令

    循环控制指令的转移也都是段内直接短转移,即(IP)←(IP)+Data8类型的转移。


    说明:

    ① 程序转移类指令都不影响状态标志。

    ② 如果条件转移指令和循环控制指令的目标地址的位移量超出了Data8所能够表示的范围,则需要用无条件转移指令JMP辅助来完成转移和循环。

  (4) 子程序调用与返回指令

  子程序(过程)通常是一个完整的、独立的有一定名称(标号)的程序段,它可以多次被调用,并在这个程序段执行完后可返回到原先调用的程序处。子程序执行的过程分为三步:

  ①子程序调用(即从主程序转移到子程序的首地址),用CALL指令。

  ② 执行子程序

  ③ 返回(即从子程序转移到主程序),用RET指令。




   6.处理器控制类指令

   这一类指令用于对CPU进行控制,例如对CPU中某些状态标志位的状态进行操作,以及使CPU暂停、等待等等。

   80868088指令系统的处理器控制指令可分为三组:

   标志操作指令

   ② 外部同步指令

   ③ 空操作指令


1、 指出源操作数的寻址方式

    ⑴ MOV  BX,2000H     ;立即数寻址       ⑵ MOV BX,[2000H]         ;直接寻址     

    ⑶ MOV  BX,[SI]     ;寄存器间接寻址   ⑷MOV  BX,[SI+2000H]    ;寄存器相对寻址

    ⑸ MOV  [BX+SI],AL  ;寄存器寻址       ⑹ ADD  AX,[BX+DI+80]   ;基址变址相对寻址

    ⑺ MUL  BL            ;寄存器寻址       ⑻ JMP  BX                 ;段内间接寻址

    ⑼ IN   AL,DX        ;端口间接寻址    ⑽ INC WORD PTR[BP+10H]   ;寄存器相对寻址

    ⑾ MOV  CL,LENGTH VAR ;立即数寻址      ⑿ MOV BL,OFFSET VAR1     ;立即数寻址

 

2、  指出下列指令是否正确 

 (1)  MOV  DS,0100H                  ;错误。源操作数是立即数时,目的操作数不能时段寄存器

 (2)  MOV  BP,AL                       ;错误。操作数类型不一致

 (3)  XCHG  AH,AL                    ;正确。

 (4)  OUT     310H,AL                   ;错误。端口直接寻址的范围应在0FFH之间

 (5)  MOV    BX,[BX]                    ;正确。

       (6)  MOV    ES:[BX+DI],AX     ;正确。

        (7)  MOV    AX,[SI+DI]              ;错误。存储器寻址中有效地址不能由两个变址寄存器组成

        (8)  MOV    SS:[BX+SI+100H],BX  ;正确。

        (9)  AND  AX,BL                      ;错误。操作数类型不一致

(10)  MOV    DX,DS:[BP]                     ;正确。

       (11)  ADD    [SI],20H                    ;错误。用PTR 说明类型

       (12)  MOV  30H,AL                     ;错误。目的操作数不能为立即数

(13)  PUSH 2000H                          ;错误。堆栈指令的操作数不能是立即数

(14)  MOV         [SI],[2000H]                     ;错误。两个操作数不能同时为存储器操作数

(15)  MOV         SI,AL                        ;错误。操作数类型不一致

(16)  ADD    [2000H],20H              ;错误。用PTR 说明类型

       (17)  MOV  CS,AX                      ;错误。目的操作数不能为代码段寄存器

(18)  INC      [DI]                             ;错误。需用PTR说明类型

       (19)  OUT  BX,AL                      ;错误。端口间接寻址的寄存器只能是DX寄存器

(20)  SHL    BX,3                         ;错误。移位次数大于1时应该用CL寄存器

(21)  XCHG CX,DS                     ;错误。交换指令中不能出现段寄存器

(22)  POP    AL                               ;错误。堆栈指令的操作数只能是字操作数(16位操作数)

 

3、  写出存储器操作数物理地址的计算表达式

(1)   MOV  AL,[DI]                    ;(DS)×10H(DI)

(2)   MOV  AX,[BX+SI]              ;(DS)×10H(BX)(SI)

       (3)   MOV  5[BX+DI],AL              ;(DS)×10H(BX)(DI)5

(4)   ADD  AL,ES:[BX]             ;(ES)×10H(BX)

(5)   SUB  AX,[1000H]              ;(DS)×10H1000H

(6)   ADC  AX,[BX+DI+2000H]   ;(DS)×10H(BX)(DI)2000H

(7)   MOV  CX,[BP+SI]            ;(SS)×10H(BP)(SI)

(8)   INC  BYTE PTR [DI]                 ;(DS)×10H(DI)

 

4、  若(DS)=3000H,(BX)=2000H,(SI)=0100H,(ES)=4000H,计算下列存储器操作数的物理地址。

       (1) (DS)×10H+(BX)=3000H×10H+2000H=32000H  

       (2) (DS)×10H+(BX)+(SI)+1000H=3000H×10H+2000H+0100H+1000H=33100 H       

(3) (DS)×10H+(BX)+(SI)=3000H×10H+2000H+0100H=32100 H         

(4) (ES)×10H+(BX)=4000H×10H+2000H=42000 H

 

5、若(CS)=E000H,说明代码段可寻址物理存储空间的范围。

    ∵ 最小物理地址为:(CS)×10H+0000H=E0000H

          最大物理地址为:(CS)×10H+FFFFH=EFFFFH

    ∴ 代码段可寻址物理存储空间的范围是:E0000HEFFFFH

 

6、设(SP)=2000H,(AX)=3000H, (BX)=5000H,执行下列程序段后,(SP)=?,(AX)=?, (BX)=?

              PUSH  AX

              PUSH  BX

              POP  AX

       (SP)1FFEH(AX)5000H (BX)5000H

 

7、试比较SUB AL,09H与CMP AL,09H这两条指令的异同。若(AL)=08H,分别执行上述两条指令后,(AL)=?,CF=?,OF=0,ZF=?

      (1)   相同点:两条指令都能完成(AL)09H的功能,并且都影响六个状态标志位;

              不同点:SUB指令将运算结果回送到AL寄存器中,而CMP指令不回送。

       (2) SUB AL,09H             (AL)=FFHCF=1OF=0ZF=0

        CMP AL,09H             (AL)=08HCF=1OF=0ZF=0

8、分别执行下列指令,试求AL的内容及各状态标志位的状态。

       (1) MOV      AL,19H     ;

              ADD       AL,61H       ;(AL)=7AH       OF=0   SF=0     ZF=0     AF=0    PF=0     CF=0

       (2) MOV      AL,19H     ;

              SUB              AL,61H       ;(AL)=B8H        OF=0    SF=1     ZF=0     AF=0    PF=1     CF=1

       (3) MOV      AL,5DH      ;

              ADD       AL,0C6H     ;(AL)=23H        OF=0   SF=0     ZF=0     AF=1     PF=0     CF=1

       (4) MOV      AL,7EH     ;

              SUB              AL,95H       ;(AL)=E9H        OF=1    SF=1     ZF=0     AF=0    PF=0     CF=1

 

9、用最少的指令,实现下述要求的功能。

       (1)   AH的高4位清零。                                               AND       AH0FH                                 

       (2) AL的高4位去反。                                                XOR     AH,0F0H             

       (3) AL的高4位移到低4位,高4位清0。                  MOV     CL4                               

                                                                                           SHR      ALCL

       (4) AL的低4位移到高4位,低4位清0。                 MOV     CL4

                                                                                           SHL      ALCL                                    

             

10、设(BX)=6D16H,(AX)=1100H,写出下列三条指令执行后,AX和BX寄存器中的内容。

              MOV     CL,06H

              ROL       AX,CL

              SHR              BX,CL                       (AX)=4004 H       (BX)=01B4H

      

11、设初值(AX)=0119H,执行下列程序段后,(AX)=?

              MOV      CH,AH

              ADD       AL,AH

              DAA

              XCHG    AL,CH

              ADC       AL,34H

              DAA

              MOV      AH,AL

              MOV      AL,CH                      (AX)=3520 H

      

12、指出下列程序段的功能。

       (1)   MOV      CX,10

              LEA              SI,First

              LEA              DI,Second

              REP   MOVSB                          First串中前10个字符传送至Second

       (2)   CLD      

              LEA              DI,[0404H]

              MOV      CX,0080H

              XOR       AX,AX

              REP  STOSW                            将起始地址为0404 H开始的80 H个单元置成0

 

13、 设(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,试求执行XCHG BX,[BP+SI]后,     (BX)=?,(2F246H)=?

              (BX)4154H                      (2F246H)6F30H

 

14、设(BX)=0400H,(DI)=003CH,执行LEA  BX,[BX+DI+0F62H]后,(BX)=?

              (BX)139E H

 

15、设(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H,执行LDS  SI,[10H]后,(SI)=?, (DS)=?

              (SI)0180 H(DS)2000 H

 

16、已知(DS)=091DH,(SS)=1E4AH,(AX)=1234H,(BX)=0024H,(CX)=5678H,(BP)=0024H,(SI)=0012H,(DI)=0032H,(09226H)=00F6H,(09228H)=1E40H,试求单独执行下列指令后的结果。

       (1) MOV      CL,20H[BX][SI]               ;(CL)0F6 H       

       (2) MOV      [BP][DI],CX                            ;(1E4F6 H)5678 H        

       (3)  LEA       BX,20H[BX][SI]              ;(BX)=0056 H 

              MOV      AX,2[BX]                           ;(AX)=1E40 H

(4)   LDS        SI,[BP][DI]                         ;

       MOV   [SI],BX                             ;((SI))=0024 H              

(5)   XCHG   CX,32H[BX]                     ;

       XCHG    20H[BX][SI],AX               ;(AX)5678 H (09226H)1234 H

17、若CPU中各寄存器及RAM参数如图所示,试求独立执行如下指令后,CPURAM相应寄存器及存储单元的内容是多少?

 

 

CPU

RAM

执行前

执行后

CS

3000H

FFFFH

CX

20506H

06H

不变

DS

2050H

0004H

BX

20507H

00H

不变

SS

50A0H

1000H

SP

20508H

87H

不变

ES

0FFFH

17C6H

DX

20509H

15H

不变

IP

0000H

8094H

AX

2050AH

37H

94H

DI

000AH

1403H

BP

2050BH

C5H

不变

SI

0008H

1

CF

2050CH

2FH

不变

 

1MOV    DX[BX+2]         ;(DX=0006H,(BX=0004H

2PUSH   CX                       ;(SP=0FFEH

3MOV    CXBX        ;(CX=0004H,(BX=0004H

4TEST    AX01         AX=8094H,(CF=0

5MOV    AL[SI]              ;(AL=87H

6ADC     AL[DI]       ;(AL=0CCH,(CF=0

               DAA                          ;(AL=32H

7INC      SI                  ;(SI=0009H

8DEC     DI                 ;(DI=0009H

9MOV    [DI]AL       ;((DI))=94H

10XCHG        AXDX AX=17C6H,(DX=8094H

11XOR    AHBL        ;(AH=84H,(BL=04H

12JMP    DX                ;(IP=17C6H

18、(DS)=2000H,(BX)=1256H,(SI)=528FH,偏移量=20A1H,(232F7H)=3280H,(264E5H)=2450H,试求执行下述指令后的结果。

       (1) JMP   BX                                         ;(IP)1256 H                

       (2) JMP   TABLE[BX]                            ;(IP)3280 H               

       (3) JMP   [BX][SI]                                 ;(IP)2450 H

19、设(IP)=3D8FH,(CS)=4050H,(SP)=0F17H,当执行CALL 2000H:0094H后,试指出(IP)、(CS)、(SP)、((SP))、((SP)+1)、((SP)+2)和((SP)+3)的内容。

 

CALL指令是5字节指令,下一条指令地址为4050H:3D94H

所以执行后

              (IP)0094H(CS)2000H(SP)0F13H

              ((SP))94H((SP)1)00H((SP)2)00H((SP)3)20H



























  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值