微机原理
This presentation is the property of its rightful owner.
Sponsored Links
1 / 115

微机原理 PowerPoint PPT Presentation


  • 113 Views
  • Uploaded on
  • Presentation posted in: General

微机原理. 第三章 80 X86 指令系统. 概述(1). 指令系统是一台计算机所能识别和执行的全部指令的集合。 指令一般包括两个部分: 操作码域 和 地址域 。 操作码域存放指令的操作码,即指明该指令应由计算机完成何种操作。 地址域确定操作数的值或地址、操作结果的地址,有的指令的地址域还指出下一条指令的地址。. 概述(2). 1、机器指令:计算机能识别的代码,机器指令是由二进制数组成的。 例如 ADDCL,BH 机器指令为0000001011001111 B PUSHAX 机器指令为01010000

Download Presentation

微机原理

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


6248134

微机原理

第三章 80X86指令系统


6248134

概述(1)

  • 指令系统是一台计算机所能识别和执行的全部指令的集合。

  • 指令一般包括两个部分:操作码域和地址域。

  • 操作码域存放指令的操作码,即指明该指令应由计算机完成何种操作。

  • 地址域确定操作数的值或地址、操作结果的地址,有的指令的地址域还指出下一条指令的地址。


6248134

概述(2)

1、机器指令:计算机能识别的代码,机器指令是由二进制数组成的。

例如ADDCL,BH

机器指令为0000001011001111B

PUSHAX

机器指令为01010000

2、汇编语言:汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。

3、汇编程序:MASM.EXE将汇编语言源程序翻译成机器语言,即目标程序。


6248134

第一节 寻址方式

  • 根据指令内容确定操作数地址的过程,称为寻址。

  • 根据寻址方式计算所得到的地址叫做有效地址EA,也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址PA ,该工作由CPU完成。

  • 寻址方式在两种方式下被涉及:操作数的寻址方式和指令的寻址方式。


6248134

一、程序存储器寻址

  • CS和IP寄存器用来保存段地址和偏移量,指出处理器要执行的下一条指令地址。CALL和JMP指令能够以下列3种方式改变CS和IP的值。

  • 1、相对寻址:提供一个8位或16位的立即数与IP寄存器的值相加,结果作为IP寄存器的新值。此时CS值不变,称为段内操作。

  • 2、直接寻址:指令提供16位立即数做为CS或IP寄存器的新值。此时可能改变CS,所以称为段间操作。

  • 3、间接寻址:指令提供一16位的存储器地址,由该存储器单元的值改变IP或CS的值。若只改变IP,则是段内操作;若改变IP和CS,则是段间操作。


6248134

二、数据存储器寻址

  • 1、立即寻址

    操作数直接放在指令中。不

    需要访问存储器。

    例3.1

    MOV AL,34H

    MOV AX,1234H

    需要注意在16位操作时,两个字节数据的高低位存储

    位置。立即数只能是源操作数。


6248134

2、寄存器寻址

  • 操作数就放在CPU的内部寄存器中,AX、BX、CX、DX、DI、SI、SP和BP,不需要访问存储器。

    例3.2:INC CX

    MOV AX,BX

    若执行前(AX)=30A6H,

    (BX)=69EDH,(CX)=40D9H

    则执行后, (AX)=69EDH,BX内容

    不变。(CX)=40DAH


6248134

3、存储器寻址

  • 操作数放在存储器中,执行部件EU计算出存储器操作数的偏移量,即有效地址EA。这是一个无符号数,由总线接口部件BIU的地址加法器计算出物理地址,然后执行存取该操作数所需的总线周期。

  • 有效地址有4种成分:

    (1)位移量

    (2)基址

    (3)变址

    (4)比例因子(386以上机器有,8086为1)

    EA=基址+(变址×比例因子)+位移量


6248134

对8086,EA=基址+变址+位移量

(1)直接寻址

有效地址由指令直接给出,有效地址只包含位移量。

MOV AL,[1234H]

默认的段寄存器是DS,也可以在指令中使用段超越前缀来指定段寄存器。

例3.3:MOV AL,ES:[1234H]

有效地址EA=1234H,在指令中直接给

出。

物理地址PA=(ES)×10H+1234H


6248134

例3.5 MOV AX,[2000H]

若(DS)=3000H,则执行情况如图3.3。

直接寻址也可用符号地址。

例3.4:MOV AX,VALUE

这里,VALUE就是存放操作数单元的符号地址。

AX=3050H


6248134

该指令也可写为 MOV AX,[VALUE]

(2)寄存器间接寻址和寄存器相对间接寻址

操作数的地址在对应的寄存器中称为寄存器间接寻址;

若还有位移量(disp)则称为寄存器相对间接寻址。

EA取自基址寄存器BX,BP或变址寄存器SI,DI

中的一个,操作数在有效地址对应的存储单元中。

即EA=(BX、BP、SI、DI之一)+disp

例3.7 MOV AX,[BX]

若(DS)=2000H,(BX)=1000H

则EA=(BX)=1000H

物理地址PA=20000H+1000H=21000H,

执行情况如图3.4。(AX)=(21000H)=50A0H


6248134

例3.5A:INC BYTE PTR[BX]

对应BX、SI、DI隐含的段寄存器是DS

对应BP隐含的段寄存器是SS

EA=(BX)

PA=(DS) ×10H+(BX)

若是寄存器相对间接寻址,则要加上位移量。

例3.6:INC BYTE PTR[BX+disp]

EA=(BX)+disp

PA=(DS)×10H+(BX)+disp


6248134

例3.9 MOV AX,COUNT[SI]

若COUNT=3000H,(DS)=3000H

(SI)=2000H,则物理地址=35000H,指令执行如图3.5所示,指令执行后(AX)=1234H

EA=3000H+2000H

=5000H

PA=30000H+5000H

=35000H

AX=1234H


6248134

(3)基址寻址和基址相对寻址

操作数的地址在基址寄存器BX,BP中称为基址寻址;若还有位移量,则称为基址相对寻址

位移量可以是8位或16位。

例3.7A:MOV AX,[BX+disp]

使用BX,默认段寄存器是DS,而BP则默认的段寄存器为SS。

EA=(BX)或(BP)+disp

PA=(DS)或(SS) ×10H+ disp


6248134

例3.8:MOV AX,COUNT[BX]

若(DS)=3000H,(BX)=2000H

COUNT=3000H,(35000H)=1234H

则EA=2000H+3000H=5000H

PA=30000H+5000H=35000H

执行该指令后,

(AX)=1234H


6248134

(4)变址寻址和变址相对寻址

操作数的地址在变址寄存器SI、DI中称为变址寻址;若还有位移量,则称为变址相对寻址。

EA=(SI)或(DI)+disp

例3.9A: MOV AH,[SI+disp]

(5)基址变址寻址和基址变址相对寻址

EA=BX或BP中的基址地址+SI、DI中的变址地址+disp;实际上这种寻址为(3)、(4)两种寻址的组合。

例3.10A: MOV AX,[BP+DI] ;此时隐含的段寄存器为SS,若用BX,则隐含的段寄存器为DS

EA=(BX或BP)+(SI或DI)+disp

PA=(DS)×10H+(BX)+(SI或DI)+disp

PA=(SS)×10H+(BP)+(SI或DI)+disp


6248134

例3.10 MOV AX,[BX][DI]

若(DS)=2100H,(BX)=0158H

(DI)=10A5H

则EA=0158H+10A5H=11FDH

PA=EA+21000H=221FDH

指令执行情况如图

3. 6所示。

指令执行后,

(AX)=1234H


6248134

例3.11:MOV AX,[MASK+BX+SI]

若(DS)=3000H,(BX)=2000H

(SI)=1000H,MASK=0250H

(33250H)=34H,(33251H)=12H

则 EA= 2000H+1000H+0250H=3250H

PA=30000H+

2000H+1000H+

0250H=33250H

指令执行如图3.7

所示。

执行该指令后

(AX)=1234H


4 i o

4、I/O端口寻址

8086采用输入/输出端口与存储器独立编址的方式。访问I/O端口需要专门指令IN和OUT。

(1)直接寻址

在指令直接给出I/O端口地址,此地址应在0-255(0-FFH)之间

IN AL,20H;从端口地址20H读入一个字节

(2)间接寻址,寄存器只能用DX

由DX给出I/O端口地址,此方式适用端口地址为0-65535(0-FFFFH)之间的任意值。

OUT DX,AL


6248134

以下三种是386以上机器有的寻址方式:

5、比例变址寻址方式

有效地址是变址寄存器内容乘以指令中指定的比例因

子,再加上位移量之和。

例3.12 MOV EAX,COUNT[ESI*4]

6、基址比例变址寻址方式

操作数有效地址是变址寄存器内容乘以指令中指定的比例因子,再加上基址寄存器的内容之和

例3.13 MOV EAX, [EBX][EDI*4]

MOV ECX, [EAX][EDX*8]

7、相对基址比例变址寻址方式

有效地址是4种成分之和。

例3.14 MOV EAX ,TABLE[EBP][EDI*4]


6248134

三、寻址方式的书写格式

  • 1、在方括号内部允许有一个或两个寄存器的名字,如果一对方括号内部有基址寄存器和变址寄存器,使用“+”作为连接。

  • 2、在方括号内部允许有位移量,使用+或—号作为连接符号。

  • 3、在方括号外部允许有位移量,可以在左边或右边。

    MOVAX,[BX+SI+6]

    MOVAX,[BX+SI]6

    MOVAX,6[BX+SI]

    MOVAX,[BX][SI]6

    MOVAX,[BX+6][SI]


6248134

8086数据存储器寻址方式小结:

1、立即寻址,操作数直接放在指令中。

2、寄存器寻址(8个通用寄存器)

3、直接寻址,有效地址由指令直接给出,

即有效地址只包含位移量。

4、寄存器间接寻址和寄存器相对间接寻址

(4个寄存器,BX、BP、SI、DI,位移量)

5、基址寻址和基址相对寻址(BX、BP,位移量)

6、变址寻址和变址相对寻址(SI、DI,位移量)

7、基址变址寻址和基址变址相对寻址

(BX、BP,SI、DI,位移量)

其中1、2两种不用访问存储器。


6248134

四、与转移指令有关的寻址方式

(1)段内直接寻址

不改变CS,在IP上加一个位移量,则

EA=(IP)+disp

例如: JMPNEAR PTR PROGIA ;段内近转移

JMPSHORT QUEST ;段内短转移

JMP 25H ;段内短转移

JMP 1025H ;段内近转移

其中PROGIA 和QUEST是转向的符号地址,在机器指令中,用位移量来表示。

(2)段内间接寻址

转向的有效地址是一个寄存器或一个存储单元的


6248134

内容。这个寄存器或存储单元的内容可用除立

即数寻址以外的任何一种寻址方式得到。转向

的有效地址用来取代IP。这时CS值不变。

例3.15:JMP BX;段内间接转移(IP)=(BX)

JMPWORD PTR[BX+TABLE]

若(BX)=1256H,(DS)=2000H

TABLE=20A1H,(232F7H)=3280H

则执行JMP BX后,(IP)=EA=1256H

执行JMPWORD PTR[BX+TABLE]后,

EA=(BX)+disp=1256H+20A1H=32F7H

(IP)=(PA)=(20000H+32F7H)

=(232F7H)=3280H


6248134

3、段间直接寻址

指令中提供了转向的段地址和偏移地址,所以用段地址取

代CS,用偏移地址取代IP。

例3.16:JMP 3500H:080BH;段间直接转移

(CS)=3500H,(IP)=080BH

例3.17:JMP FAR PTR NEXT_PROG

其中NEXT_PROG是转向的符号地址;FAR PTR为段间转移

的操作符。

执行该指令后, NEXT_PROG所在段的段地址送CS,

NEXT_PROG在该段内的偏移量送IP。

例3.18:C1SEGMENT

JMP FAR PTR NEXT_PROG

C1ENDS


6248134

C2SEGMENT

NEXT_PROG : …

C2ENDS

执行JMP FAR PTR NEXT_PROG

后,C2段的段地址送CS,在C2段内

NEXT_PROG的偏移量送IP。

4、段间间接寻址

用存储器中两个相继字的内容来取代IP和CS,达到段间转移

的目的。低地址中内容送IP,高地址中内容送CS。

例3.18:JMP DWORD PTR [INTERS+BX]

其中[INTERS+BX]说明寻址方式为基址相对寻址方式;

DWORD PTR 是双字操作符。


6248134

例3.19:JMP DWORD PTR[BX+DI+ALPHA]

这是基址变址相对寻址。

EA=(BX)+(DI)+ALPHA

PA=(DS)×10H+EA

(IP)=(PA) ;低地址内容送IP

(CS)=(PA+2);高地址内容送CS

转移的物理地址是:

PA=(CS) ×10H+(IP)

段间间接转移,目标地址存放在PA开始的4个连续

单元中,其中低地址两个单元放IP内容,高地址两个

单元放CS内容。

与转移地址有关的寻址方式如图3.9所示。


6248134

第二节 指令编码格式

一、概述

机器指令:计算机能识别和执行的指令的

二进制代码。如:1011000001100010

汇编指令:用助记符表示机器指令的操作

码和操作数,例如上面指令的汇编指令是

MOV AL,62H


6248134

二、指令编码

1、编码格式

8086的机器指令长度为1-6字节。


6248134

2、指令前缀

  • 前缀是一条指令,当它执行时,并不导致处理器产生一个立即的动作,而只是指示处理器改变其后面指令的执行。

  • 前缀一字节长,一条指令可有多个前缀。

    1)重复前缀:REPcond(重复条件)与串指令结合使用,说明重复执行次数。

    2)锁定前缀:LOCK在多处理器时使用。


6248134

3、段超越前缀

所有访问内存的指令都有一个隐含的段寄存器

来计算物理地址,段超越前缀可以改变默认的段

寄存器。

例3.20:MOV AX,ES:[13AAH];将ES段的

13AAH和13ABH两个单元的内容装入到AX。

4、操作码

操作码用来指示该指令的操作,一般一字节。如

PUSH AX

01010 000

此外,还有5个标志位:D,W,S,V,Z,见表3-3


6248134

5、寻址方式编码

  • 寻址方式字节中存放关于操作数类型和操作数寻址的信息。如前图分为3个域。

    1)mod域:即方式域,决定如何解释r/m域和位移量域。见表3-4

    2)reg域:寄存器域,指定一个寄存器操作数,也可作为额外的操作码位。见表3-5

    3)r/m域:当mod=11时,本域指示一个寄存器操作数,当mod≠11时,本域指出存储器操作数的有效地址计算方法。见表3-6


6248134

6、位移量

指令编码中的位移量部分给出一个8位或16位的数用来进行有效地址计算。

16位位移量是低字节在前,高字节在后。

7、立即数

指令编码中的立即数部分给出一个8位或16位的立即数。

注意:16位数是低字节在前,高字节在后。


6248134

三、指令编码举例

例1:MOV [BX+DI-6],CL

机器码:

10001000, 01001001,11111010

=88H,49H,FAH

例2:ADD AX,BX

机器码:00 00 00 1 1 1100 00 11

操作码 D W 寻址 AX BX

=03H,C3H


6248134

第三节 指令执行时间

一、概述

一条指令的完整执行包括取指令,计算操作数地址,取操作数,执行指令,存放操作结果等步骤,各步所需时间的总和就是指令执行时间。

二、有效地址计算

存取操作数前,需计算出有效地址EA,它需要的时钟周期根据寻址方式不同而不同。

参见表3-7。


6248134

三、指令执行时间计算

假定指令已预取在指令队列中,因而取指令时间不考虑。

指令执行时间=计算有效地址时间+基本执行时间+访问内存时间


6248134

第四节 8086汇编指令系统

8086汇编指令系统包括100多条指令,分为6大类:

数据传送指令 14

算术运算指令 20

逻辑运算和移位指令 13

串操作指令 13

转移指令 28

处理器控制指令 12


6248134

一、数据传送指令

共14条,分为4组


1 1 mov

1 、通用传送指令(1) MOV 目的,源

  • ① 源和目的操作数不能都是存储器操作数

  • ② 目的操作数不能是立即数,也不能是CS寄存器

  • ③ 不允许两个段寄存器之间传送数据

  • ④ 立即数不能直接送段寄存器

  • ⑤ 不影响标志位

    功能: (源) (目的)

    例1:MOV AX,10ACH;10ACH (AX)


Mov word ptr bx 2000h 12abh

MOV WORD PTR[BX+2000H],12ABH

BX=1200H,CS=1800H,IP=0500H,DS=3000H


6248134

以下两条指令只有386以上机器有:

MOVSX 目的,源

带符号扩展传送指令。

例2 MOVSX EAX,CL

例3 MOVSX EDX,[EDI]

MOVZX 目的,源

带零扩展传送指令

例4 MOVZX DX, AL

例5 MOVZX EAX,DATA


2 push

(2) PUSH 源 ;压栈

(SP)-2 (SP),(源) ((SP+1),(SP))

(3) POP 目的 ;出栈

((SP+1),(SP)) (目的),(SP+2) (SP)

① 以上2条指令只能对字操作

② 不能POP CS

下面举例:


6 push bx

例6 PUSH BX

CS=1000H,IP=0030H,SS=2000H,

SP=0040H,BX=2340H


6248134

以下4条指令只有386以上机器有:

(4) PUSHA/PUSHAD

PUSHA ;16位通用寄存器依次进栈

执行操作:(SP)-16 (SP)

PUSHAD ;32位通用寄存器依次进栈

执行后(ESP)-32 (ESP)

(5) POPA/POPAD

POPA ;16位通用寄存器依次出栈

执行后(SP)+16 (SP)

POPAD ;32位通用寄存器依次出栈

执行后(ESP)+32 (ESP)


6 xchg

(6) XCHG 目的,源

该指令将源和目的的值互换

  • ① 两个操作数必须有一个在寄存器中,可以是字节或字

  • ②可以在寄存器之间或寄存器和存储器之间交换数据

  • ③ 不允许使用段寄存器

    例7:XCHGBX,[BP+SI]

    若(BX)=6F30H,(BP)=0200H,(SI)=0046H

    (SS)=2F00H,(2F246H)=4154H

    源操作数的物理地址=2F000H+0200H+0046H=2F246H

    执行该指令后: (BX)=4154H,(2F246H)=6F30H


2 1 xlat

2、累加器专用传送指令(1) XLAT ;换码指令

把一种编码表示转换为另一种编码表示。XLAT指令在使用前

需将编码表的首地址装入BX,将表的一个索引值装入AL,索引

值为0-255。

例8:设(DS)=A000H A000:0010 30H

(BX)=0010H 31H

表的起始地址为A0010H,表中放

数字0-9的ASCII码

MOVBX,0010H

MOVAL,06H

XLAT A000:0016 36H

执行该程序后,(AL)=36H


6248134

(2) IN 累加器,端口地址

(3) OUT 端口地址,累加器

  • 以上指令的累加器可为AL或AX

  • 当端口地址在0-255之间时可用立

    即寻址方式,否则需将端口地址先放入

    DX中,然后使用间接寻址方式。

    例9: INAL,20H

    MOV DX,0AB4H;注意字母不能是开头

    OUT DX,AL


3 1 lea

3、地址传送指令(1) LEA 目的,源

  • 用来把源操作数的偏移地址传送给目的操作数。LEA指令中目的操作数必须是16位的通用寄存器。

    例10:LEA BX,[BX+DI+6]

    指令执行前若(BX)=1000H,(DI)=0200H

    则指令执行后,(BX)=1206H

    (2) LDS 目的,源

  • 将源操作数指定的存储器中4个连续字节传送给目的操作数和DS。传送时低2字节装入目的操作数,高2字节装入DS。

    (3) LES 目的,源

  • 与LDS相似,只是高字节装入ES。


11 lds si di 100ah

例11:LDS SI,[DI+100AH]

若CS=1000H,IP=0640H,DS=2000H,DI=2400H

执行完后:

DS=2230H

SI =0180H


6248134

以下3条指令只有386以上机器有:

LFS REG,SRC;指针送寄存器和FS

LGS REG,SRC;指针送寄存器和GS

LSS REG,SRC;指针送寄存器和SS

执行操作为:

(REG) (SRC)

(SREG) (SRC+2)

例12:LSS ESP,MEM

把MEM单元中存放的48位地址分别装入

ESP和SS寄存器中。


4 1 lahf

4、标志传送指令(1) LAHF

  • 将标志寄存器FR的低字节传送到AH

    (2) SAHF

  • 将AH寄存器内容送到标志寄存器FR的低字节

    (3) PUSHF

  • 先将SP的值减2,再将16位的FR入栈

    (4) POPF

  • 将当前栈顶和次栈顶的数据弹出到FR,再将SP的值加2,以指向新的栈顶


6248134

以下4条是386以上机器有的指令:

(5)PUSHA/PUSHAD

PUSHA;8个16位通用寄存器依次进栈,

指令执行后,(SP)=(SP)-16

PUSHAD;8个32位通用寄存器依次进栈,

指令执行后,(ESP)=(ESP)-32

(6)POPA/POPAD

POPA; 16位通用寄存器依次出栈,

指令执行后,(SP)=(SP)+16

POPAD;32位通用寄存器依次进栈,

指令执行后,(ESP)=(ESP)+32


6248134

二、算术运算指令一共20条指令


6248134

1、运算数据格式和对标志位影响

(1)数据类型


6248134

(2)运算数据格式和对标志位影响

对标志位的影响:所有算术运算指令都影响状态标志

CF 、PF、AF 、ZF 、SF和OF

① 当无符号数运算结果溢出时,CF=1

② 当有符号数运算产生溢出时,OF=1

③ 当运算结果中低8位有偶数个1或0个1,则PF=1

④ 若加法时第3位给第4位进位,或减法时第3位从

第4位借位,则AF=1

⑤ 若运算结果为0,则ZF=1

⑥ 若运算结果为负数,则SF=1


6248134

2、加法指令

  • ADD 目的,源 ;ADD AL,27H

  • ADC 目的,源 ;带进位的加法,如实现多字节加法,下面是做4字节的加法,两个数放在SI和DI

    MOV AX,[SI] ;开始的存储单元中

    ADD [DI],AX

    MOV AX,[SI+2]

    ADC [DI+2],AX;注意要用带进位的加法ADC

  • INC 目的 :自加1,例如: INC AX

  • XADD 目的,源;相加并交换指令(386以上机器)

    TEMP (源)+(目的)

    (源) (目的) ;(目的) TEMP


13 add word ptr bx 106bh 1234h

例13:ADD WORD PTR[BX+106BH],1234H

CS=1000H,IP=0300H,DS=2000H,BX=1200H

3344H+1234H

=4578H

结果


6248134

2、加法指令(1)

  • AAA

    调整两个非压缩十进制数相加的结果,它不能单独使用,总是跟在加法指令后,且总是对AL寄存器操作。结果是一个非压缩十进制数,仍放在AL中,如果向高位有进位(AF=1),则进到AH中。

  • DAA

    用于对两个压缩十进制数的相加结果进行调整,也总是跟在加法指令后。


6248134

AAA指令的具体算法如下:

IF (AL AND 0FH)>9 OR (AF=1)THEN

AL=AL+6

AH=AH+1

AF=1

CF=1

ELSE

AF=0

CF=0

ENDIF


6248134

DAA指令的算法如下:

IF(AL AND 0FH)>9 OR(AF=1)THEN

AL=AL+6

AF=1

ENDIF

IF (AL>9FH)OR(CF=1)THEN

AL=AL+60H

CF=1

ENDIF


6248134

例14:求6+7 (非压缩十进制数)

指令如下:MOVAL,06

MOVBL,07

ADDAL,BL

AAA 00000110

+ 00000111

(AL)= 00001101

因为(AL)>9,要调整 00000110

(AL)= 00010011

(AH)=1,(AL)=AL AND 0FH=03


6248134

例15:求48+29(压缩的十进制数)

程序如下:MOVAL,48H

ADD AL,29H

DAA 01001000

+ 00101001

01110001 AF=1

调整 + 00000110

01110111

例15中若是非压缩的十进制数,两个数放在存

储单元UP1、UP2中,运算结果放在DX中,则


6248134

  • 设(UP1)=08, (UP2)=09

    ( UP1+1)=04,,( UP2+1)=02

    这里UP1、UP2是存储单元的符号地址,则编程

    如下:

    MOVAX,0

    MOVAL,UP1

    ADDAL,UP2 ;个位数相加

    AAA ;对结果调整

    MOVDL,AL ;结果(DL)=07

    MOVAL,UP1+1

    ADCAL,UP2+1;十位数和进位相加

    AAA ;对结果调整

    MOVDH,AL ;结果(DH)=07


6248134

3、减法指令

  • SUB 目的,源;不带借位的减法

  • SBB 目的,源;带借位的减法

  • DEC 目的 ;减1指令

  • NEG 目的 ;求补指令

  • CMP 目的,源 ;结果不送回,只影响状态位

  • AAS ;减法的ASCII调整指令

  • DAS ;减法的十进制调整指令

    下面两条只有486以上机器有:

  • CMPXCHG 目的,源 ;比较并交换

  • CMPXCHG8B 目的 ;比较并交换8字节


6248134

CMPXCHG DST,SRC

如果(AC)=(DST)

则 ZF 1,(DST) (SRC)

否则ZF 0,(AC) (SRC)

该指令对标志位的影响与CMP指令相同。

CMPXCHG8B DST,SRC

如果(EDX,EAX)=(DST)

则 ZF 1,(DST) (ECX,EBX)

否则ZF 0,(EDX,EAX) (DST)

该指令只能用于Pentium以上机器,只影

响ZF标志位。


6248134

  • 例16:若(AL)=9AH,执行指令

    SUB AL,65H 后,各标志位的值?

    解:9AH-65H=9AH+(-65H),这里9AH本身是负数补码

    [-65H]补=10011011=9BH

    10011010 9AH

    + 10011011 9BH

    100110101 可以根据以前讲过的溢出判断方法来判

    断是否溢出。次高位无进位,最高位有进位,所以OF=1

    SF=0,ZF=0,AF=1,PF=1,CF=1,OF=1

    运算结果溢出。需要修正,修正办法是将符号位变成1,则结果

    变成10110101,此数是补码,其原码为11001011,真值是

    -75=-4BH。

    实际上,9AH=(10011010)补,其真值是-102

    65H=101

    -102-101=-203=(-128)+(-75),其中-128舍去


6248134

比较指令 CMP 目的,源 ;目的-源

(1)两个无符号数比较判断方法

ZF=1 ,目的=源

ZF=0 ,CF=0 则目的 > 源

CF=1 则目的 < 源

(2)带符号数比较

ZF=1 ,目的=源

ZF=0 OF=1 SF=1

或 OF=0 SF=0 则目的 > 源(OF和SF相同)

OF=1 SF=0

或 OF=0 SF=1 则目的 < 源(OF和SF不同)

从上面可知,判断两个数的大小需要检测三个标

志位,即ZF、OF和SF。


6248134

例17:比较54与24的大小

解: 54-24=54+(-24)

[-24]补=11101000,[54]补=00110110

00110110

+ 11101000

100011110

OF=0,SF=0,则目的 > 源,即54 >24

例18:比较120与-74的大小

解:120-(-74)=124+74

01111000

01001010

011000010

OF=1,SF=1,则目的 > 源,即120 >-74


6248134

例19:比较24与54的大小

解:24-54=24+(-54)

00011000 24的补码

+11001010 -54的补码

11100010

OF=0,SF=1,则目的 < 源,即24 <54

例20:比较-24与120的大小

解:-24-120=[-24]补+ [-120]补

11101000 = [-24]补

+ 10001000 = [-120]补

101110000

OF=1,SF=0,则目的 < 源,即-24 <120


6248134

  • 求补指令:NEG 目的

    求补是把操作数按位求反后,在最低位加1。

    即 FFFFH - (目的)+1 (目的)

    相当于0-(目的) (目的)

    例21:若(BX)=6780H,执行NEG BX后,

    (BX)=? 0000H

    解: -6780H

    FFFFH-6780H+1 1 9880H

    =0000-6780H=9880H

    执行指令后,(BX)=9880H,是-6780的补码

    CF=1,OF=0,ZF=0,PF=0,AF=0 ,SF=1

    即对+6780求补得到-6780的补码


6248134

  • 求补运算

    对一个二进制数按位(包括符号位)求反后,再在末位加1的运算称位求补运算。

    求补 求补

    [X]补 [-X]补 [X]补

    对一个正数的补码表示按位求反再在末位加1,则可以得到与此正数相应的负数的补码表示。

    例如: [117]补 = 01110101=75H

    [-117]补 =10001011=8BH

    所以要求[- Y]补 , 只要对[Y]补 求补就可得到。

    *如果已知一个负数的原码,求该负数的补码,则

    按位求反(符号位除外),再在末位加1。


6248134

减法的十进制调整指令DAS和ASCII码调整指令AAS总是紧

跟在SUB和SBB指令之后,调整AL寄存器中的结果。

  • 例22:求7231-2958(压缩十进制数)

    解: MOVAL,31H 00110001 31

    SUBAL,58H - 01011000 58

    DAS 11011001 AF=1 CF=1

    MOVBL,AL - 01100110

    MOVAL,72H 01110011 结果 73

    SBBAL,29H 01110010 72

    DAS - 00000001 减CF

    MOVBH,AL 01110001

    结果存放在BX中, - 00101001 29

    (BX)=4273 01001000 AF=1

    - 0110

    01000010 结果 42


6248134

  • 例23:设X、Y、Z均为双精度数(双字长)各自存放在

    X、X+2,Y、Y+2,Z、Z+2的存储单元中。编制程序计算

    :W=X+Y+24-Z,结果放在W、W+2各两个字存储单元。 解:程序段如下:

    MOVAX,X;X低位字存入AX中

    MOVDX,X+2;X高位字存入DX中

    ADDAX,Y;X、Y的低位字相加

    ADCDX,Y+2;X、Y的高位字和低位进位相加

    ADDAX,24;X+Y和的低位字与24相加

    ADCDX,0;X+Y和的高位字与低位的进位相加

    SUBAX,Z;(X+Y+24)的和的低位字与Z低

    位字相减

    SBBDX,Z+2; (X+Y+24)的高位字与Z的高位

    字及借位相减

    MOVW,AX;结果低位字存入W和W+1两个单元

    MOVW+2,DX;结果高位字存入W+2和W+3两个

    单元

本题要注意符号地址


6248134

4、乘法指令

  • MUL 源 ;无符号数乘法,只影响标志位OF和CF,

    其他状态标志在执行MUL指令后无定义。若运算结果高

    字节(或高字)有效,则OF=1,CF=1。

    字节型乘法,一个乘数在AL中,在指令中给出另一

    个乘数,结果放在AX中;

    字型乘法,一个乘数在AX中,指令中给出另一个乘

    数,结果为双字,高16位在DX中,低16位在AX中。

    双字型乘法,(EDX,EAX) (EAX)*(SRC)

  • IMUL 源 ;有符号数乘法

  • AAM ;乘法的ASCII码调整指令,只能在MUL指令后。

    调整算法:AH = AL/10

    AL = AL MOD 10

    乘法没有十进制调整指令


24 mul byte ptr bx 2ah

例24:MUL BYTE PTR[BX+2AH]

CS=3000H,IP=0250H,AL=12H,DS=2000H,BX=0234H,

源操作数是字节变量66H,实际上做12H×66H

12H*66H=072CH

运算结果高字节有效,则OF=1,CF=1,其他4个标志无定义。


6248134

例25: MULBL

指令执行前:AL=B4H=180,BL=11H=17

指令执行后:AX=0BF4H=3060

例26:IMULBL

指令执行前:AL=B4H=-76,BL=11H=17

指令执行,先将AL的符号去掉,即76=4CH,先

进行4CH×11H=050CH。再进行符号处理,正

负得负,即乘积应该是负数,因此将结果050CH

求补码: [050CH]求补=FAF4H,真值为-1292

指令执行后,AX==FAF4H,

(-76)×17=-1292 ,BL=11H


6248134

例27:计算两个非压缩十进制数9×5,编写程序

段。

解:AAM指令用来调整两个非压缩十进制数相乘的

结果,调整后得到的非压缩十进制数其高位放在

AH中,低位放在AL中。

MOVAL,09

MOVBL,05

MULBL

AAM

执行该指令段后:AH=04H,AL=05H


6248134

5、除法指令

  • DIV 源 :无符号数除法

    8位除法:AX/源的商在AL中,AX/源的余数在AH中

    16位除法:(DX,AX)/源的商在AX中,余数在DX

    32位除法: (EDX,EAX)/(SRC)的商在EAX

    中,余数在EDX中

  • IDIV 源 :有符号数除法

  • AAD :调整非压缩十进制数,调整被除数,

    调整算法:AL=AH*10+AL

    AH=0 ;除法也没有十进制调整指令

  • CBW :将AL中字节的符号位扩展到AH中,成为字

  • CWD :将AX中字的符号位扩展到DX中,成为双字


6248134

以下指令只有386以上机器有:

  • CWDE ;字转换为双字,将AX的符号扩展到EAX中,形成EAX中的双字。

  • CQD ;双字转换为4字,EAX中的符号扩展到EDX中,形成EDX、EAX中的4字。

  • BSWAP r32;字节交换指令,使指令指定的32位寄存器的字节次序变反,即1、4字节互换,2、3字节互换

    例28:BSWAP EAX

    若(EAX)=11223344,则执行指令后,

    (EAX)=44332211


6248134

  • 例29:DIVBL

    指令执行前,AX=0400H,BL=B4H,即AX

    为无符号数1024,BL为无符号数180

    指令执行 101 商

    10110100 0000010000000000

    10110100

    100110000

    10110100

    01111100 余数

    指令执行后,AH=7CH(余数),AL=05H(商)


6248134

例30:IDIV BL

指令执行前,AX=0400H,BL=B4H(补码),AX为有符号

数+1024,而BL为有符号数-76

指令执行,先将BL=B4H求补,[B4H]求补=4CH=76

1101 商

01001100 0000010000000000

01001100

01101000

01001100

01110000

01001100

00100100 余数

正数除以负数,商为负数,必须对除法结果的商求补:

(0DH)求补=F3H,其真值为-13;余数为24H=36D。


6248134

  • 指令执行后,AH=24H=36(余数)

  • AL=F3H,真值-13(商)

    例31:65/9,十进制数除法只能是非压缩BCD码

    解:指令段如下:

    MOVAH,6

    MOVAL,5

    AAD ;AAD调整的是被除数,见书71页

    MOVBL,9

    DIVBL

    结果: 商 AL=7

    余数 AH=2


6248134

例32:计算53/3,编写程序段(此题不要求)

解:由于商是两位非压缩BCD数,必须有两个8位寄存器

来存放。

MOVAH,0

MOVAL,5;这里不用调整,因为AH=0

MOVBL,3

DIVBL ;商在AL,余数在AH

MOVDH,AL;第一个商01送DH

MOVAL,3 ;被除数个位送AL

AAD ;调整被除数AX

DIVBL ;商在AL,余数在AH

MOVDL,AL ;第二个商07送DL

结果:商的高位 DH=01H,商的低位 DL=07H

余数 AH=02H


6248134

例33: MUL BL

AAM ;乘法的ASCII调整

如执行指令前,(AL)=07H,(BL)=09H

执行MUL后,(AL)=3FH

执行AAM后,(AH)=06H,(AL)=03H

例34:AAD ;除法的ASCII调整

执行指令前(AX)=0604H

执行指令后(AX)=0040H

例35: 已知(AX)=203FH

执行指令 AAM 后(AX)=?

结果: (AX)=0603H


6248134

三、逻辑运算和移位指令

  • 1、逻辑运算指令

  • NOT 目的 ;取反指令

  • AND 目的,源 ;按位与指令

  • OR 目的,源 ;按位或指令

  • XOR 目的,源 ;按位异或指令

  • TEST 目的,源 ;测试指令,与AND指令操作相同,只是不改变目的操作数的内容


6248134

例36:要求屏蔽一字节中的高4位(所谓屏蔽,就

是将屏蔽位清0),可用AND AL,0FH来实现。

指令执行前 AL=39H

指令执行后 AL=09H

例37:OR AL,80H,使AL中内容的最高位置1,

其余位不变。

指令执行前 AL=2BH

指令执行后 AL=ABH

例38:使寄存器清零,可以执行XOR AX,AX,

自己与自己异或,结果为0

若AX=1ADEH

执行该指令后,AX=0000H


6248134

2、移位指令

  • SHL/SAL 目的,计数;逻辑和算术左移

  • SHR 目的,计数 ;逻辑右移

  • SAR 目的,计数 ;算术右移(除2)

  • ROL 目的,计数 ;不带进位循环左移

  • ROR 目的,计数 ;不带进位循环右移

  • RCL 目的,计数 ;带进位循环左移

  • RCR 目的,计数 ;带进位循环右移

    以下两条只有386以上机器有:

  • SHLD DST,REG,CNT ;双精度左移

  • SHRD DST,REG,CNT ;双精度右移


6248134

算术左移

算术右移

逻辑左移

逻辑右移


6248134

注意以下几点:

8086移位指令中的计数是指移位次数,若该次数为1可直

接写在指令中。如:SHR AL,1

若要移位多次,其次数必须放在CL寄存器中。如:

MOV CL,4

SHR AL,CL ;AL的内容逻辑右移4次

例39:DS=F800H,DI=180AH,

(F980AH)=0064H

执行指令 MOV CL,5

SAR WORD PTR[DI],CL后,结果?

解:PA=F8000+180AH=F980AH,即对该单元内容

0064H算术右移5次,结果:

(F980AH)=0003H,CF=0


6248134

四、串操作指令

  • 串操作指令对字节串或字串进行每次一个元素(字节或字)的操作,被处理的串长度可达64K字节。

  • 串操作指令使用隐含寻址方式,源串地址为DS:SI,目的串地址为ES:DI,待处理串的长度放在CX中。

  • 串操作的重复前缀包括:

  • REP;REPE/REPZ;REPNE/REPNZ;

  • 串操作SI和DI的增长方向由DF标志给出,DF=0地址增量,DF=1地址减量


6248134

MOVSB/MOVSW

串传送指令,如:

MOV CX,100

REP MOVSB

连续传送100个字节

CMPSB/CMPSW

串比较指令,

例40:如右边的程序段检测两个串是否完全相同。若相同,程序转到STR_EQU

MOV SI,0400H

MOV DI,0600H

CLD

MOV CX,64H

REPZ CMPSB

JZ STR_EQU

……

STR_EQU:

……

(1)串传送和串比较指令


41 rep movsb rep

例41:REP MOVSB 演示;REP是无条件重复

DS=1000H,SI=2000H,ES=3000H,DI=1020H,CX=0064H,DF=0


6248134

SCASB/SCASW

串扫描指令,用AL或AX中的字节或字与ES:DI所指内存

单元的内容比较,根据比较结果设置标志位,并修改DI寄存

器的值,以指向下一个串元素。

例42:寻找字符串中是否有字符‘$’?

CLD

MOV CX,100;重复次数

MOV DI,0400H

MOV AL,’$’;扫描的值是‘$’

REPNE SCASB;找到‘$’,ZF=1

JZ ZER;若找到,则转移到ZER

….

ZER:

……

(2)串扫描操作指令


6248134

LODSB/LODSW;读串

例43:将100个字中组成的

字串中的负数相加,其和存

放到该串后面的单元中

CLD

MOV SI,1000H

MOV BX,0

MOV DX,0

MOV CX,101

LOD:DEC CX

JZ STO;读完,转STO

LODSW;从源串中取

; 一个字存入AX

MOV BX,AX

AND AX,8000H ;判断

;该元素是否是负数

JZ LOD;不是,转LOD

ADD DX,BX;是,加

JMP LOD

STO:MOV [SI],DX

读串是将DS:SI所指存储单元

的内容读到AL或AX,并修改SI

STOSB/STOSW;写串

写串指令,把AL或AX中的值

写到ES:DI指定的地址

(3)读串和写串操作指令


6248134

386以上机器增加下列指令:

MOVSD ;双字操作

CMPSD ;双字操作

SCASD ;双字操作

LODSD ;双字操作

STOSD ;双字操作

INSB/INSW/INSD DST,DX

串输入指令,将端口号在DX寄存器中的I/O地址

的字节、字或双字传送到附加段的目的变址寄存器

所指向的存储单元中,并根据DF的值修改目的变

址寄存器的内容。

OUTSB/OUTSW/OUTSD DX,SRC

串输出指令 ,SRC是源变址寄存器,DX端口号。


6248134

五、转移指令

  • 当程序发生转移时,CS和IP的值可由指令指定。

  • 段间转移或段间调用可用FAR表示

  • 段内转移或段内调用可用NEAR表示

  • 若短距离内的转移(-128-127),称为

    短转移,用SHORT表示


6248134

1、概述

  • 直接转移:转移的目标地址直接出现在指令中

  • 间接转移:转移的目标地址间接存在某一寄存器

    或某一内存单元内

  • 相对转移:转移目标地址是相对于该指令而言。

    一般在同一段内,所有段内转移都是相对转移

  • 绝对转移:a段内间接转移,CS不变,IP值放在

    寄存器或内存 b段间直接转移,新的CS和IP值,

    指令给出全部两个16位数 c段间间接转移,目标

    地址的CS和IP都放在存储器的4个连续单元中,

    前2个是偏移地址,后2个是段基址。


6248134

JMP ;无条件转移

例44: JMP 1025H;段内直接转移

JMP 25H;段内直接短转移

JMP BX;段内间接转移

JMP 3500H:080BH;段间直接转移

JMP DWORD PTR[BX+010AH]

;段间间接转移,目标地址存放在DS段从BX+010AH开始的4个存储单元中

2、无条件转移指令


6248134

JMP SHORT OPR ;段内直接短转移

(IP) (IP)+8位位移量

JMP NEAR PTR OPR ;段内直接近转移

(IP) (IP)+16位位移量

JMP WORD PTR OPR ;段内间接近转移

(IP) (EA)

JMP FAR PTR OPR ;段间直接远转移

(IP) OPR的段内偏移地址

(CS) OPR所在段的段地址

JMP DWORD PTR OPR;段间间接远转移

(IP) (EA)

(CS) (EA+2)


6248134

3、调用子程序指令

  • CALL 过程名

    过程调用,处于当前代码段的过程称作近过程,

    用NEAR表示;处于其他代码段的过程叫远过程,

    用FAR表示。

    CALL 1234H;段内直接调用

    CALL BX;段内间接调用

    CALL 3000H:0005H;段间直接调用

    CALL DWORD PTR[DI];段间间接调用


6248134

  • 例45:判断下面的调用指令是什么调用?

    CALL AX ;段内调用

    CALL NEAR[BX] ;段内调用

    CALL NEAR[1000];段内调用

    CALL NEAR[SI] ;段内调用

    ;段内调用时,NEAR可省略

    CALL FAR[BX] ;段间调用

    CALL FAR[SI] ;段间调用

    CALL FAR[1000] ;段间调用

    ;段间调用时,FAR不能省略


6248134

  • 返回指令

  • RET ;段内返回,从栈顶弹出一个字送到IP,栈顶指针SP+2

  • RETF ;段间返回,从栈顶弹出第一个字送到IP,SP+2,再弹出一个字送到CS,SP再加2。RETF使SP加上4

  • RET disp16;与RET相同,SP+2后,再使SP加上disp16位移量

  • RETF disp16;与RETF相同,SP+4后,再使SP加上disp16位移量

    例46:若SP=FFF2H,执行RETF 0004后,SP=?

    SP=FFF2H+4+4=FFFAH,同时CS和IP有了新值


6248134

3、条件转移指令


6248134

3、条件转移指令(续)


6248134

4、循环控制指令

  • LOOP 短标号

    CX-1 CX,CX!=0转移

  • LOOPE /LOOPZ 短标号

    CX-1 CX,ZF=1且CX!=0转移

  • LOOPNE/LOOPNZ 短标号

    CX-1 CX,ZF=0且CX!=0转移

  • JCXZ 短标号

    若CX=0转移


47 array n 0 di 0 si n di si ax negval

MOVCX,N

MOVBX,0

MOVDI,BX

MOVSI,BX

AGAIN:CMP ARRAY[BX],0

JLELESSOREQ

;小于或等于零转(负数或零转)

INCDI;正数个数加1

JMPSHORT NEXT

LESSOREQ:

JLNEXT;负数转NEXT

INCSI;0的个数加1

NEXT:ADD BX,2;偏移地址加2

DECCX;计数器减1

JNZAGAIN;未完转

MOVAX,N

SUBAX,DI;N-(DI)

SUBAX,SI;再-(SI)

;负数的个数在AX中

JZSKIP

;没有负数转SKIP(AX=0)

JMP NEAR PTR NEGVAL

;有负数转NEGVAL

SKIP:

NEGVAL:

例47:在存储器中有一个首地址为ARRAY的N个字的数组,要求测试其中正数、0及负数的个数。正数个数放在DI中,0的个数放在SI中,并根据N-(DI)-(SI)求得负数的个数放在AX中,如果有负数,则转移到NEGVAL去执行。


6248134

5、中断及中断返回指令

  • INT 中断类型码

    中断类型码为0-255

  • INTO 溢出中断指令

  • IRET 中断返回

    关于中断将在第六章中介绍。


6248134

六、处理器控制指令

  • 1、标志操作指令

    STC ;CF=1

    CLC ;CF=0

    CMC ;将CF取反

    STD ;将方向标志DF设为1

    CLD ;DF=0

    STI ;IF=1

    CLI ;IF=0


6248134

六、处理器控制指令(续)

  • 2、外同步指令

    HLT ;暂停指令

    WAIT ;等待指令

    ESC ;交权指令

    LOCK ;封锁总线

  • 3、空操作

    NOP


6248134

以下控制指令只有386以上机器有:

4、BOUND 界限指令

格式:BOUND REG,MEM

REG中为数组下标,MEM存放数组上下界,该

指令检查数组下标是否在规定的上下界内。

5、ENTER 建立堆栈帧指令

格式:ENTER imm16,imm8

这里,立即数imm16指定堆栈帧的大小,

即其所占的字节数;立即数imm8是给出嵌

套层数。

6、LEAVE 释放堆栈帧指令

格式:LEAVE


6248134

386以上的机器增加了下列指令:

七、位测试并修改指令

BT目的,源;位测试,将目的中由源指

定的位的值送CF。

BTS 目的,源;位测试并置1

BTR 目的,源;位测试并置0

BTC 目的,源;位测试并变反

八、位扫描指令

BSF REG,SRC;正向位扫描

BSR REG,SRC;反向位扫描


6248134

九、条件设置指令

1、根据单个条件标志的值把目的字节置1

SETZ/SETE DST ;结果为0(或相等),目的字节置1

SETNZ/SETNE DST ;结果不为0(或不相等),目的字节置1

SETS DST ;结果为负,目的字节置1

SETNS DST ;结果为正,目的字节置1

SETO DST ;结果溢出,目的字节置1

SETNO DST ;结果不溢出,目的字节置1

SETP/SETPE DST ;奇偶位为1,目的字节置1

SETNP/SETPO DST ;奇偶位为0,目的字节置1

SETC/SETB/SETNAE DST

;进位位为1,或低于,或不高于或等于,目的字节置1

SETNC/SETNB/SETAE DST

;进位位为0,或不低于,或高于或等于,目的字节置1


6248134

2、比较两个无符号数,根据比较结果把目的

字节置1:

SETB/SETNAE/SETC;与上面SETC同

SETNB/SETAE/SETNC;与上面SETNC同

SETBE/SETNA;测试条件CF ZF=1

低于或等于,或不高于则目的字节置1

SETNBE/SETA;测试条件CF ZF=0

不低于或等于,或高于则目的字节置1

3、比较两个带符号数,根据比较结果把目的

字节置1:


6248134

SETL/SETNGE DST

小于,或不大于或等于则目的字节置1

测试条件:SF V OF = 1

SETNL/SETGE DST

不小于,或大于或等于则目的字节置1

测试条件:SF V OF = 0

SETLE/SETNG DST

小于或等于,或不大于则目的字节置1

测试条件: (SF V OF) V ZF = 1

SETNLE/SETG DST

不小于或等于,或大于则目的字节置1

测试条件: (SF V OF) V ZF = 0


  • Login