101
微微微微微微微微微 主主 主主主 微微微微微微微微微

微机原理及接口技术

Embed Size (px)

DESCRIPTION

微机原理及接口技术. 主编 梁建武. 中国水利水电出版社. 3.1 汇编语言程序设计基础. 以助记符形式表示计算机指令 助记符( mnemonic )是便于人们记忆、并能描述指令功能和指令操作数的符号 助记符是表明指令功能的英语单词或其缩写 汇编格式指令以及使用它们编写程序的规则就形成汇编语言( Assembly Language ) 汇编语言程序:用汇编语言书写的程序 汇编程序:将汇编语言程序“汇编”成机器代码目标模块的程序. 3.1.1 汇编语言特点. 汇编语言的优点: 直接控制计算机硬件部件 编写“时间”和“空间”两方面最有效程序 汇编语言的缺点: - PowerPoint PPT Presentation

Citation preview

Page 1: 微机原理及接口技术

微机原理及接口技术

主编 梁建武

中国水利水电出版社

Page 2: 微机原理及接口技术
Page 3: 微机原理及接口技术

3.1 汇编语言程序设计基础

以助记符形式表示计算机指令 助记符( mnemonic )是便于人们记忆、并能描述指

令功能和指令操作数的符号 助记符是表明指令功能的英语单词或其缩写

汇编格式指令以及使用它们编写程序的规则就 形 成 汇 编 语 言 ( Assembly Language )

汇编语言程序:用汇编语言书写的程序 汇编程序:将汇编语言程序“汇编”成机器

代码目标模块的程序

Page 4: 微机原理及接口技术

3.1.1 汇编语言特点

汇编语言的优点: 直接控制计算机硬件部件 编写“时间”和“空间”两方面最有效程序

汇编语言的缺点: 与处理器密切有关 需要熟悉计算机硬件系统、考虑许多细节 编写繁琐,调试、维护、交流和移植困难

Page 5: 微机原理及接口技术

3.1.2 8086 指令系统概述

Intel 8086 指令系统共有 117 条基本指令 可分成 6 个功能组

数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 控制转移类指令 处理机控制类指令

Page 6: 微机原理及接口技术

由 4 部分组成:

标号 :-- 标号表示该指令在主存中的逻辑地址

指令助记符 -- 代表一种指令

目的操作数,源操作数 -- 表示参与操作的对象

; 注释 -- 对该指令或程序段功能的说明

3.1.2 8086 指令系统概述

Page 7: 微机原理及接口技术

1. 数据传送类指令 数据传送指令是将源操作数传送到目标操作

数,即将数据、地址或立即数从一个位置传送到存储单元中。数据传送指令是最常使用的一类指令

除标志寄存器传送指令外,均不影响标志位 指 令 包 括 :

MOV , PUSH , POP , XCHG , LEA

, LDS/LES , XLAT , IN , OUT

Page 8: 微机原理及接口技术

(1) 传送指令 MOV

MOV reg/mem,imm 立即数送寄存器或主存

MOV reg/mem/seg,reg 寄存器送(段)寄存器或主存

MOV reg/seg,mem 主存送(段)寄存器

MOV reg/mem,seg 段寄存器送寄存器或主存 举例

演示演示

立即数

段寄存器CS DS ES SS

通用寄存器AX BX CX DXBP SP SI DI

存储器

Page 9: 微机原理及接口技术

MOV 举例

例: MOV 数据传送 MOV AL, 20H MOV AH, AL MOV SI, 200H MOV AX, [BX] MOV [DI], AX MOV AX, DS MOV ES, AX MOV BYTE PTR [SI],0AH Mov WORD PTR [SI+2],0BH

Page 10: 微机原理及接口技术

注意: 立即数、代码段寄存器 CS 只能作源操作数。 IP 寄存器不能作源操作数或目的操作数。 MOV 指令不能在两个存储器单元直接传送数据,

也不能在两个算寄存器之间直接传送数据。 两个操作数的类型属性要一致。

Page 11: 微机原理及接口技术

下列指令是非法的:MOV AX,BL ; 类型不一致MOV CS,AX ;CS 不能作目的操作数

Page 12: 微机原理及接口技术

(2) 堆栈指令 PUSH POP

堆 栈 : 后 进 先 出FILO , 位 于 堆 栈段; SS 段寄存器记录其段地址

堆栈只有一个出口,即当前栈顶;用堆栈指 针 寄 存 器 SP 指定,堆栈指针寄存器SP 的初值决定了所用堆栈的大小。

Page 13: 微机原理及接口技术

PUSH 格式: PUSH src ; src 是源操作数 操作: SP←SP - 2 , SS:[SP]←src ,将堆

栈指针 SP 减 2 ,再将 src 压入堆栈顶部, src为 16 位操作数

例: PUSH AX ; 将 AX 内容压入堆栈 ;(SP) - 1←AH, 高地址存入高字节 ; (SP) - 2←AL, 低地址存入低字节 ; (SP)←(SP) - 2 , SP 指向新栈顶由于堆栈操作都是以字为单位进行的,所以 SP 总是指向偶地址单元。

PUSH 压入堆栈指令

Page 14: 微机原理及接口技术

POP 格式: POP dest 操作: dest←SS:[SP] , SP←SP + 2 ,将

栈顶的一个字弹出传送到 dest ,再将 SP 加2 ,将 SP 指向新的栈顶, dest 的寻址方式是除立即寻址之外的所有存储器寻址方式和寄存器寻址方式。

例: POP BX ; 将栈顶内容弹出到 BX

; ( BL )←( SP ),低地址弹出到低字节 ; ( BH )←( SP )+ 1 ,高地址弹出到高字节 ; ( SP )←( SP )+ 2 , SP 指向新栈顶

POP 弹出堆栈指令

Page 15: 微机原理及接口技术

(3) 交换指令 XCHG把两个地方的数据进行互换。 格式为: XCHG OPR1 , OPR2 执行操作:( OPR1 ) < - > ( OPR2 ) 其中 OPR 表示操作数。指令允许字或字节操作, 386 及其后继机型还允许双字

操作。

XCHG 指令形式 XCHG reg , reg/mem ; reg <——> reg/mem 寄存器与寄存器之间对换数据。 寄存器与存储器之间对换数据。 不能在存储器与存储器之间对换数据。 不允许使用段寄存器,立即数不能作为一个操作数,不能在累加器之间进行。

Page 16: 微机原理及接口技术

(3) 交换指令 XCHG 举例 例:

MOV BX, 0ABCDH MOV AX,0ABCDH XCHG AX, BX ;AX 与 BX 交换内容, ; 结果: AX = 0ABCDH ;BX = 3412H

Page 17: 微机原理及接口技术

XCHG BX , [BP + SI] 如指令执行前: ( BX )= 6F30H ,( BP )= 0200H ,( SI )=0046H ,( SS )= 2F00H ,( 2F246H )=4154H OPR2 的物理地址= 2F000 + 0200 + 0046 =2F246 则指令执行后: ( BX )= 4145H ( 2F246H )= 6F30H

Page 18: 微机原理及接口技术

地址传送指令

Page 19: 微机原理及接口技术

(4) 有效地址传送指令 LEA

格式: LEA reg , mem操作 :(reg)←mem ,将指定内存单元的偏移(有效地址)送到指定寄存器。

LEA BX,BUFFER ;将符号地址为 BUFFER 的存储单元 ;的偏移地址送到 BX 中MOV BX,BUFFER ;将 BUFFER 存储单元中的内容 ;传送到 BX 中MOV BX,OFFSET BUFFER ; OFFSET BUFFER 表示存储 ;单元 BUFFER 的偏移地址。

Page 20: 微机原理及接口技术

(4) 有效地址传送指令 LEA 举例

例: 设:( SI ) =2000H

LEA BX , [SI + 3412H]

执行指令结果将偏移地址 5412H 传送到 BX , 即 BX=5412H

Page 21: 微机原理及接口技术

(5) LDS/LES 指针传送指令

LDS r16,mem; r16←mem ,; DS←mem+2 LDS 指令将主存中

mem 指 定 的 字 送至 r16 , 并 将mem 的下一字送DS 寄存器

LES r16,mem; r16←mem ,; ES←mem+2 LES 指令将主存中

mem 指定的字送至 r16 , 并 将mem 的下一字送ES 寄存器

Page 22: 微机原理及接口技术

例 3.42      LES  DI , [BX]    如指令执行前( DS )= B000H ,( BX )= 080AH ,( 0B080AH )= 05AEH ,( 0B080CH )= 4000H , 则指令执行后( DI )= 05AEH ,( ES )= 4000H 。 BX 默认段寄存器为 DS.

Page 23: 微机原理及接口技术

累加器专用传送指令 :IN(input) 输入OUT(output) 输出XLAT(translate) 换码这组指令只限于使用累加器 EAX,AX 或 AL 传送信息 .

Page 24: 微机原理及接口技术

(6)XLAT 换码指令

格式: XLAT 或 XLAT table操作: AL←[(BX)+(AL)] ,将 AL 中存放的代码转换为另一

种代码。XLAT 换码指令又称查表转换指令,它可以根据表项的序号查处表中对应代码的内容,是将 BX 指定的表格中的 AL 指定位

移处的数据取出赋给 AL 。在使用该指令前,需要在存储器中建

立一个要转换成的目的代码表格 table ,将表格的首地址 table

存放在 BX 寄存器,待转换代码存放在 AL 寄存器中,待转换代

码须为相对表格首地址的偏移量,通过( BX ) +(AL) 地址将读取

的代码存放到 AL 中,实现代码转换。 XLAT 换码指令默认存储

器为数据段 DS 。

Page 25: 微机原理及接口技术

例:

设 TABLE首地址为 2000H ,连续区域中存放着

数 字 0~9 对 应 的 格 雷 码 :18H,34H,05H,06H,

09H,0AH,0CH,11H,12H,14H,(DS)=0F000H,

执行如下程序段:LEA BX,TABLE ; 将 TABLE 的有效地址传送给

;BX,BX=2000HMOV AL,8XLAT ; 执行后 (AL)=12H

Page 26: 微机原理及接口技术

2. 输入输出指令

输入输出指令为 I/O 传送指令,实现 CPU 与 I/O端口之间的通信。 CPU 只限于用累加器 AL 或AX来传送信息。

8086 用于寻址外设端口的地址线为 16 条,端口最多为 216 = 65536 ( 64K )个,端口号为0000H~ FFFFH ,当端口号大于 256 时,须将端口先装到 DX 寄存器中,后使用输入输出指令来传送信息。

每个端口用于传送一个字节的外设数据

Page 27: 微机原理及接口技术

(1)IN 输入指令

将外设数据传送给 CPU 内的 AL/AX长格式为: IN AL , PORT (字节) ;PORT端口号 0~255 IN AX , PORT (字) 执行的操作: ( AL )←( PORT )(字节) ( AX )←( PORT + 1 , PORT )(字) 格式为: IN AL , DX (字节) ;DX 表示的端口范围达 64K IN AX , DX (字) 执行的操作: ( AL )←(( DX ))(字节) ( AX )←(( DX )+ 1 ,( DX ))(字)

Page 28: 微机原理及接口技术

例: IN AL, 80H

;(AL)←(80H 端口 ) ,从 80H 端口读入字节信息存放在 AL 寄存器

IN AX, DX (AX)←[(DX+1 , DX)] 从 DX 中装载的端

口读入字信息存放在 AX 寄存器

(1)IN 输入指令 举例

Page 29: 微机原理及接口技术

(2)OUT 输入指令 将 CPU 内的 AL/AX 数据传送给外设

OUT PORT , AL (字节) OUT PORT , AX (字) (PORT )←( AL )(字节) (PORT + 1 , PORT )←( AX )(字) 短格式为: OUT DX , AL (字节) OUT DX , AX (字) 执行的操作: (( DX ))←( AL )(字节) (( DX )+ 1 ,( DX ))←( AX )(字)

举例

Page 30: 微机原理及接口技术

(2)OUT 输入指令 举例 例: OUT 5 , AL 从 AL 寄存器输出一个字节到端口 5 。 又如: in al,21h mov ah,al in al,20h ;直接寻址,字节量输入 或 in ax,20h ;直接寻址,字量输入 或 mov dx,20h in ax,dx ;间接寻址,字量输入

Page 31: 微机原理及接口技术

3. 算术运算指令

四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算

请注意算术运算类指令对标志的影响 指 令 包 括 :

ADD 、 ADC 、 INC 、 DAA 、 AAA 、 SUB 、 SBB 、 DEC 、 CMP 、 NEG 、 AAS/DAS 、 MUL 、 IMUL 、 DIV 、 IDIV 、CBW 、 CWD 、

Page 32: 微机原理及接口技术

加法指令 :ADD 加法ADC 带进位加法INC 加 1

Page 33: 微机原理及接口技术

(1) 不带进位的加法指令 ADD

格式: ADD dest,src

操作:目的操作数←目的操作数 + 源操作数,dest ←(src)+(dest), 源操作数可以是立即数、寄存器或内存单元,目的操作数不可是立即数,只可以为寄存器或内存单元。源操作数和目的操作数不能同时为存储器,而且他们的类型必须一致,即同为字或字节。

Page 34: 微机原理及接口技术

(1) ADD 加法指令 举例 例:

ADD AL, 12H ;AL 中内容和 12H相加,结果放在 AL 中 ADD SI, [BX + 20H] ;SI 中内容和 BX + 20H

;BX + 21H 所指两存储单元内容相加,结果在 SI 中 ADD SI, CX ;SI 和 CX 内容相加,结果在 SI 中 ADD [BX + SI], AX ;BX + SI 和 BX + SI + 1 两单元内容与 AX 中内容相加

; 结果在 BX + SI , BX + SI + 1 所指单元中

Page 35: 微机原理及接口技术

ADD 指 令 对 6 个状态标 志 均产生影 响 , 主 要 是CF 、 ZF 、 OF 、 SF 标志位。带符号数相加要考虑溢出,从

硬件角度:默认参与运算的操作数都是有符号数,当两数的符号位相同,而和的结果相异时有溢出,则OF=1 ,否则 OF=0.

Page 36: 微机原理及接口技术

例 3-4

已 知 ( BX ) =D75FH , 指 令 ADD BX,8046H

执行后,标志状态各是多少? D75FH=1110 0111 0101 1111

8046H=1000 0000 0100 0110 0110 0111 1010 0101结果: CF=1 、 ZF=0 、 PF=0( 运算结果的低 8 位

中的“ 1” 的个数为偶数时 PF=1 ,为奇数时, PF=0 。 )

、 OF=1 、 SF=0

Page 37: 微机原理及接口技术

(2) ADC 带进位的加法 ADC 指令将源与目的操作数相加,再加上进位 CF 标志,结 果送到目的操作数。 格式: ADC  DST , SRC  执行的操作:( DST )←( SRC )+( DST )+ CF  其中 CF 为进位位的值。 ADC 指令按状态标志的定义相应设置。 ADC 指令主要与 ADD配合,实现多精度加法运算。

Page 38: 微机原理及接口技术

(2) ADC 带进位的加法 举例

例: ADC AL, 34H ;AL←(AL) + 34H + (CF) ADC AX, CX ;AX←(AX) + (CX) + (CF) ADC BX , [DI] ;BX←(BX) + [DI + 1][DI] +

(CF)

Page 39: 微机原理及接口技术

如指令执行前:( DX ) =0002H ,( AX ) =0F365H ,( BX )=0005H ,( CX ) =0E024H 。 指令序列为:ADD  AX , CX   ;( AX ) =0D389H , SF=1 ,ZF=0 , CF=1 , OF=0ADC  DX , BX    ;( DX ) =0008H , SF=0 , ZF=0 , CF=0 , OF=0 ,结果正确。

Page 40: 微机原理及接口技术

(3) INC 加 1 指令

INC 指令对操作数加 1 (增量) INC 指令不影响进位 CF 标志,按定义设置

其他状态标志 INC reg/mem

; reg/mem←reg/mem + 1 例:

INC BX INC BYTE PTR [BX] BX 所指的字节单元 +1

Page 41: 微机原理及接口技术

减法指令

SUB(subtract) 减法SBB(subtract with borrow) 带借位

减法DEC(decrement) 减 1NEG(negate) 求补CMP(compare) 比较

Page 42: 微机原理及接口技术

(4) SUB 不考虑借位的减法指令

SUB 指令将目的操作数减去源操作数,结果送到目的操作数。 格式: SUB  DST , SRC     执行的操作:( DST )←( DST )-( SRC ) SUB 指令按照定义相应设置状态标志。 SUB 减法指令形式 :SUB reg , imm/reg/mem   ; reg←reg - imm/reg/memSUB mem , imm/reg           ; mem←mem -imm/reg

Page 43: 微机原理及接口技术

(4) SUB 不考虑借位的减法指令 举例

例: SUB AH, 0F0H

;AH ← (AH) - 0F0H

SUB [BX + 20H], DX

;[BX + 20H] ← ([BX + 20H]) - (DX )

SUB AX, CX

Page 44: 微机原理及接口技术

例 :      SUB  [SI+14H] , 0136H     如指令执行前( DS ) =3000H ,( SI ) =0040H ,( 30054H ) =4336H , 则指令执行后:( 30054H ) =4200H , SF=0 , ZF=0 , CF=0 , OF=0例 : SUB DH , [BP+4] 如指令执行前( DH ) =41H ,( SS ) =0000H ,( BP ) =00E4H ,( 00E8H ) =5AH 则指令执行后:( DH ) =0E7H , SF=1 , ZF=0 , CF=1 , OF=0

Page 45: 微机原理及接口技术

(5) SBB 考虑借位的减法指令

SBB 指 令将 目 的操作数减去源操作数,再减去借位CF (进位),结果送到目的操作数。

格式: SBB  DST , SRC执行的操作:( DST )←( DST )-( SRC )- CFSBB 指令按照定义相应设置状态标志

SBB 指令主要与 SUB配合,实现多精度减法运算 SBB 指令形式 : SBB reg,imm/reg/mem

; reg←reg - imm/reg/mem - CF SBB mem,imm/reg

; mem←mem - imm/reg - CF

Page 46: 微机原理及接口技术

(5) SBB 考虑借位的减法指令 举例

例: MOV AX, 5678H

MOV DX, 1234H

SUB AX, 6789H ;CF = 1

SBB DX, 1122H ;DX = 0111H

Page 47: 微机原理及接口技术

(6) DEC 减 1 指令

DEC 指令对操作数减 1 (减量) 格式: DEC OPR

执行的操作:( OPR )←( OPR )- 1

DEC 指令不影响进位 CF 标志,按定义设置其他状态标志 DEC 减 1 指令形式 :

DEC reg/mem

; reg/mem←reg/mem - 1

Page 48: 微机原理及接口技术

(7) CMP 比较指令CMP 指令将目的操作数减去源操作数,按照定义相应设置状态标志格式 :CMP OPR1,OPR2执行的操作:( OPR1 )-( OPR2 ) CMP 指令执行的功能与 SUB 指令相同,但结果不回送目的操作数CMP比较指令形式 CMP reg , imm/reg/mem ; reg - imm/reg/mem

CMP mem , imm/reg ; mem - imm/reg

执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等。

Page 49: 微机原理及接口技术

(7) CMP 比较指令 举例

例: CMP AL, 0AH

CMP CX, DI

CMP DI, [BX + 03]

Page 50: 微机原理及接口技术

(7) NEG 求补指令 NEG 指令对操作数执行求补运算:用零减去操作数,然后结果返回操作

数 格式: NEG OPR 执行的操作:( OPR )←-( OPR ) 求补运算也可以表达成:将操作数按位取反后加 1 NEG 指令对标志的影响与用零作减法的 SUB 指令一样 NEG reg/mem ; reg/mem←0 - reg/mem

Page 51: 微机原理及接口技术

(8) 乘法指令

MUL r8/m8;无符号字节乘法; AX←AL×r8/m8

MUL r16/m16;无符号字乘法; DX.AX←AX×r16/

m16

IMUL r8/m8;有符号字节乘法; AX←AL×r8/m8

IMUL r16/m16;有符号字乘法; DX.AX←AX×r16/

m16

Page 52: 微机原理及接口技术

( 1 )无符号数乘法指令 MUL

格式: MUL SRC 执行的操作: 字节操作数: ( AX )← AL*SRC 字操作数: ( DX , AX )← AX*SRC功能:完成字节与字节相乘、字与字想乘,且默认的操作数放在 AL 或 AX

中,而源操作数由指令给出。 8 位数相乘,结果为 16 位数,放在 AX 中; 16 位

数相乘,结果为 32 位数,高 16 位放在 DX 中,低 16 位放在 AX 中。注意:源

操作数不能为立即数。

Page 53: 微机原理及接口技术

( 2 ) IMUL 带符号数乘法

格式: IMUL  SRC  执行的操作: 字节操作数: ( AX )← AL*SRC 字操作数: ( DX , AX )← AX*SRC

Page 54: 微机原理及接口技术

MUL 指令——若乘积的高一半( AH 、 DX )为 0 ,则OF=CF=0 ;否则 OF=CF=1 。

IMUL 指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0 ;否则均为 1 。

乘法指令对其他状态标志没有定义。 对标志没有定义:指令执行后,这些标志是任意的、不可预测(就是谁也不知道是 0 还是 1 )。

对标志没有影响:指令执行不改变标志状态。在乘法指令中,目的操作数必须是累加器,字运算为 AX ,字节运算为

AL,指令中的操作数可以使用除立即数方式以外的任何一种寻址方式。乘法指令对除 CF 和 OF 位以外的条件码位无定义。

Page 55: 微机原理及接口技术

(8) 乘法指令 举例

例 1 : 2AH × 3EH MOV AL, 2AH MOV BL, 3EH MUL BL ;AX=0A2CH , OF = CF = 1 ;AX 高 8 位含有有效数值例 2 0B4H × 011H MOV AL, 0B4H MOV BL, 11H IMUL BL ;AX = OBF4H=-1292 , OF = CF = 1 ;AX 高 8 位含有有效数值,非符号扩展

Page 56: 微机原理及接口技术

指令解说: MOV    AL , 0B4H       ;( AL ) =B4H MOV    BL , 11H         ;( BL ) =11H两条指令执行之后, AL 中的值是: 0xB4    , BL 中的值是: 0x11 ,当执行 IMUL 指令时,在处理数据前, CPU首先会查看两个寄存器的符号位, AL 的二进制形式是 ( AL=10110100 ) , BL 的二进制形式是 (BL=00010001 ) ,显然,是一正一负,结果肯定为负, CPU 将其记录下来,然后进行正常的补码运算,处理方法是,将补码转换成原码绝对值,计算得出结果,在转换成处理器所识别的补码形式:

Page 57: 微机原理及接口技术

AL 是负数,所以原码 =补码末尾减 1 ,其余全部取反 。 AL=10110100  末尾减 1 是 10110011  全部取反,得到原码绝

对值 01001100 ( 0x4B ) BL 是正数,正数的原码是什么?正数原码补码都是一样的,所以 BL

的补码形式还是 00010001 ( 0x11 ) AL * BL = 0x4B * 0x11 = 0x050B  ( 有 IMUL 指 令 说 明 可知,结果保存扩展到 16 位,然后保存到 AX 寄存器中 )

现在我们得到了原码相乘的运算结果(注意,是绝对值), 0x050B   转换成二进制就是 0000 0101 0000 1100

0000 0101 0000 1100 为此时 AX 的原码绝对值,转换成补码的形式就是,全部取反得 : 1111 1010 1111 0011   ,再末尾加1   得到

1111 1010 1111 0100  也就是十六进制的 FAF4 ,保存到 AX寄存器中就是

AX = 0FAF4

Page 58: 微机原理及接口技术

除法指令DIV ( unsigned divide )无符号数除法 IDIV ( signed divide )带符号数除法 除法指令的功能

除法指令分无符号和有符号除法指令。 除法指令的除数显式给出,隐含使用另一个操作数 AX 、 DX 。

字节除法: AX 除以 r8/m8 , 8 位商存入 AL , 8 位余数存入 AH 。 字除法: DX.AX 除以 r16/m16 , 16 位商存入 AX , 16 位余数存入 DX 。

除法指令对标志没有定义。 除法指令会产生结果溢出,即除法中断错:当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器 AL/AX 不能表达,便产生溢出, 8086CPU 中就产生编号为 0 的内部中断——除法错中断。 对 DIV 指令,除数为 0 ,或者在字节除时商超过 8 位,或者在字除时商超过 16位。 对 IDIV 指令,除数为 0 ,或者在字节除时商不在 -128~ 127范围内,或者在字除时商不在 -32768~ 32767范围内则发生除法溢出。

Page 59: 微机原理及接口技术

除法指令 格式: DIV  SRC

     执行的操作: 字节操作:( AL )←( AX ) / ( SRC )的商 ( AH )←( AX ) / ( SRC )的余数 字操作: ( AX )←( DX.AX ) / ( SRC )的商 ( DX )←( DX.AX ) / ( SRC )的余数

商和余数均为无符号数。 DIV 除法指令形式 DIV r8/m8 ; al←ax÷r8/m8 的商, ; ah←ax÷r8/m8 的余数 DIV r16/m16 ; ax←dx.ax÷r16/m16 的商, ; dx←dx.ax÷r16/m16 的余数   

Page 60: 微机原理及接口技术

IDIV 带符号数除法

格式: IDIV  SRC     执行的操作: 字节操作: ( AL )←( AX ) / ( SRC )的商 ( AH )←( AX ) / ( SRC )的余数 字操作: ( AX )←( DX.AX ) / ( SRC )的商 ( DX )←( DX.AX ) / ( SRC )的余数 操作数必须时带符号数;商和余数均为带符号数;且余数的符号和被除数的符号相同。

Page 61: 微机原理及接口技术

例 : 设( AX ) =0400H ,( BL ) =0B4H 即 ( AX )为无符号数的 1024D ,带符号数的+ 1024D ( BL )为无符号数的 180D ,带符号数的- 76D 执行 DIV BL 的结果是: ( AH ) =7CH=124D 余数 ( AL ) =05H=5D 商 IDIV BL 的结果是: ( AH ) =24H=36D 余数 ( 与被除数符号相同 ) ( AL ) =0F3H= - 13D 商

Page 62: 微机原理及接口技术

(10) 其它算术指令CBW

; AL 的符号扩展至 AH;如 AL 的最高有效位是 0 ,则 AH = 00; AL 的最高有效位为 1 ,则 AH = FFH 。 AL

不变CWD; AX 的符号扩展至DX;如 AX 的最高有效位是 0 ,则 DX = 00; AX 的最高有效位为 1 ,则 DX = FFFFH 。 AX

不变

Page 63: 微机原理及接口技术

(10) 其它算术指令 举例

例: MOV AL, 0ABH

CBW

;AX = 0FFABH

MOV AX, 1234H

CWD ;DX = 0000H , AX = 1234H

Page 64: 微机原理及接口技术

例 3-6 计算:( V -( X*Y+Z - 540 )) /X     其中 X , Y , Z , V 均为 16 位带符号数,已分别装入 X , Y , Z , V 单元中,要求上式计算结果的商存入 AX ,余数存入 DX 寄存器。 编制程序如下:  mov  ax , x     ; 取乘数 X 到 AX            imul  y     ; 做 X*Y, 结果存 DX,AX            mov  cx , ax    ; 保存结果低 16 位到 cx 中 mov  bx , dx    ; 保存结果高 16 位到 cx 中 mov  ax , z     ; 取 Z 到 AX            cwd         ; 把 Z 变成 32 位 , 因为现在是 32 位运算 add  cx , ax    ;X*Y 的低 16  位加上 Z 的低 16 位 , 放在 cx 中 adc  bx , dx    ;X*Y 的高 16  位加上 Z 的高 16 位加低位的进位 , 放在bx 中 sub  cx , 540               sbb  bx , 0                 mov  ax , v                 cwd                     sub  ax , cx                    sbb  dx , bx                    idiv  x    

Page 65: 微机原理及接口技术

4. 位操作指令

位操作类指令以二进制位为基本单位进行数据的操作

这是一类常用的指令,都应该掌握 注意这些指令对标志位的影响

逻辑运算指令 AND OR XOR NOT TEST

移位指令 SHL SHR SAR ROL ROR RCL RCR

Page 66: 微机原理及接口技术

(1) AND 逻辑“与”指令对两个操作数执行逻辑与运算,结果送到目的操作数。 格式: AND  DST , SRC     执行的操作:( DST )←( DST )∧( SRC ) AND 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 AND 指令可用于屏蔽某些位(同 0相与),不影响其他位。  AND 逻辑与指令形式 AND reg , imm/reg/mem       ; reg←reg∧imm/reg/mem       AND mem , imm/reg           ; mem←mem∧imm/reg

例: AND AL, 10010011 ; 将 AL 中的第 0 、 1 、 4 、 7 位保留,其他位清零

Page 67: 微机原理及接口技术

(2) OR 逻辑“或”指令对两个操作数执行逻辑或运算,结果送到目的操作数。 格式: OR  DST , SRC     执行的操作:( DST )←( DST )∨( SRC )

OR 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 OR 指令可用于置位某些位(同 1相或),不影响其他位。

 OR 逻辑或指令格式  OR reg , imm/reg/mem        ; reg←reg∨imm/reg/mem OR mem , imm/reg            ; mem←mem∨imm/reg

例: OR BL, 0F0H ; 将 BL 的高 4 为置 1 ,其他位不变

Page 68: 微机原理及接口技术

(3)XOR 逻辑“异或”指令对两个操作数执行逻辑异或运算,结果送到目的操作数。 格式: XOR  DST , SRC (相同为 0 ,不同为 1 ) 执行的操作:( DST )←( DST ) ⊕ ( SRC )

XOR 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 XOR 指令可用于求反某些位(与 1相异或),不影响其他位。 XOR异或指令形式 XOR reg , imm/reg/mem       ; reg←reg ⊕ imm/reg/mem        XOR mem , imm/reg           ; mem←mem ⊕ imm/reg 例: XOR AL, 0A5H ; 将 AL 的第 0 、 2 、 5 和 7 位取反,其他位不变

Page 69: 微机原理及接口技术

(4) TEST 测试指令对两个操作数执行逻辑与运算,结果不回送到目的操作数。 格式: TEST  OPR1 , OPR2     执行的操作:( OPR1 )∧( OPR2 )

TEST 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 TEST 指令通常用于检测一些条件是否满足,但又不希望改变源操作数的情况。

 TEST测试指令形式 TEST reg , imm/reg/mem     ; reg∧imm/reg/mem        TEST mem , imm/reg          ; mem∧imm/reg

例: TEST AX, 0010H ;若 ZF = 0 ,则 AX第 4 位为 1 ,否则,第 4 位为 0

Page 70: 微机原理及接口技术

(5) NOT 逻辑“非”指令

对一个操作数执行逻辑非运算。 格式: NOT  OPR     执行的操作:( OPR )←~( OPR ) NOT 指令是一个单操作数指令。 NOT 指令不影响标志位。

NOT 逻辑非指令形式 NOT reg/mem     ; reg/mem←~reg/mem

例: MOV AL, 5FH NOT AL ;AL = 0A0H ,标志同上一条指令,不变

Page 71: 微机原理及接口技术

(6) 移位指令

将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作

SHL reg/mem,1/CL SAL reg/mem,1/CL ;逻辑 / 算术左移,最高位进入 CF ,最低位补 0

SHR reg/mem,1/CL ;逻辑右移,最低位进入 CF ,最高位补 0

SAR reg/mem,1/CL ;算术右移,最低位进入 CF ,最高位不变

Page 72: 微机原理及接口技术

移位指令对标志位的影响:按照移入的位设置进位标志 CF ;根据移位后的结果影响 SF 、 ZF 、 PF ;对 AF 没有定义。如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF :如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1 ;否则 OF = 0 。当移位次数大于 1 时,OF 不确定。

Page 73: 微机原理及接口技术

1) 逻辑左移指令格式 : SHL OPR , CNT (移位次数)

功能:将指定操作数左移 CNT 位,每次最高位移入CF ,空出的最低位补 0

例 : SHL AL , 1

逻辑左移 1 位相当于把无符号的操作数乘以2

CF

0

OPR

MOV CL , 3

SHL AL , CL

Page 74: 微机原理及接口技术

0CFOPR

逻辑右移一位相当于把无符号的操作数除以 2

功能:将操作数右移 CNT 位,每次最低位进入CF ,空出的最高位补 0

2) 逻辑右移指令格式 : SHR OPR , CNT (移位次数)例 : SHR AL ,1

MOV CL , 3

SHR AL , CL

Page 75: 微机原理及接口技术

功能:将指定操作数右移 CNT 位,每次移位最低位进入 CF ,空出的最高位填充原来的值,即原来为 0

填 0 ,原来为 1 ,填 1

CFOPR

3) 算术左移移位

格式 : SAL OPR , CNT

功能:执行操作与 SHL完全相同

4) 算术右移指令格式 : SAR OPR , CNT

例 : SAL AL ,1

Page 76: 微机原理及接口技术

(6) 移位指令 例 1 :已知 (SI) = 1230H

MOV CL, 2 SHL SI, 1;左移 1 位, (SI) = 2460H , CF = 0 , OF = 0 SAL SI, CL ;左移 2 位, (SI) = 9180H , CF = 0 , OF 值不确定 SHL SI, 1 ;左移 1 位, (SI) = 2300H , CF = 1 , OF = 1

例 2 : MOV DX, 9063H MOV CL, 4 SHR DX, 1 ;右移 1 位, (dx) = 4831H , CF = 1 , OF = 1 SHR DX, CL ;右移 4 位, (dx) = 0483H , CF = 0 , OF 不确

定 例 3 :

MOV DX, 9616 MOV CL, 3 SAR DX, 1 ;右移 1 位, (dx) = 0CB0BH , CF = 0 SAR DX, CL ;右移 3 位, (dx) = 0F961H

Page 77: 微机原理及接口技术

例: MOV CL , 3

0F4H

则指令执行后 ( SI )=

5140H

SAR AL , CL

指令执行前( AL ) =0A6H

则指令执行后( AL ) =

MOV AL , 0A6H

1 0 1 0 0 1 1 0AL

1 1 0 1 0 0 1 1AL

1 1 1 0 1 0 0 1AL

1 1 1 1 0 1 0 0AL

CF

11

0

MOV CL , 2

SAL SI , CL

指令执行前( SI ) =1450H

SI 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0

SI 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0

Page 78: 微机原理及接口技术

功能:将指定操作数左移 CNT 位,每次移位最高位进入 CF ,其它位顺序左移一位,空出的最低位由新的 CF 值填充。

CF OPR

5 )循环左移指令

格式 : ROL OPR , CNT

例: MOV CL , 3

ROL BL , CL

MOV BL , 0C6H

1 1 0 0 0 1 1 0BL

1

10 0 0 1 1 0 1 1 0

CF

1 0 0 0 1 1 0 1

0 0 0 1 1 0 1 1

Page 79: 微机原理及接口技术

功能:将指定操作数右移 CNT 位,每次最低位移入 CF ,其他位顺序右移,空出的高位由新的 CF 值填充。

CFOPR

(6) 循环右移指令

格式 : ROR OPR , CNT

例: MOV CL , 2

ROR DH , CL

MOV DH , 0C6H

Page 80: 微机原理及接口技术

功能:将指定的操作数连同进位位一起左移 CNT次,每次移位, CF 移入操作数的最低位,操作数的最高位移入 CF ,其他位顺序左移。

CF OPR

(7) 带进位的循环左移指令

格式 : RCL OPR , CNT

例: MOV CL , 2

RCL BH , CL

MOV BH , 0C6H

Page 81: 微机原理及接口技术

功能:将指定的操作数连同进位位一起右移 CNT次,每次移位, CF 移入操作数的最高位,操作数的最低位移入 CF ,其他位顺序右移。

(8) 带进位的循环右移指令

格式 : RCR OPR , CNT

例: MOV CL , 2

RCR BH , CL

MOV BH , 0C6H

CFOPR

Page 82: 微机原理及接口技术

例: MOV AX, 56ABH MOV CL, 4 ROL AX, 1 ;循环左移 1 位 ;(AX) = 0AD56H , CF = 0 , OF = 1 ROR AX, CL ;循环右移 4 位, (AX) = 6AD5H , CF

= 0 循环移位指令对标志的影响

按照指令功能设置进位标志 CF 不影响 SF 、 ZF 、 PF 、 AF 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF :如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1 ;否则 OF = 0 。当移位次数大于 1 时, OF 不确定

Page 83: 微机原理及接口技术

例 : ( AX ) =0012H ,( BX ) =0034H ,要求把它们装配在一起形成( AX ) =1234H ,可编制程序如下: MOV  CL , 8        ROL  AX , CL        ADD  AX , BX   

Page 84: 微机原理及接口技术

5. 串操作指令

串操作指令是 8086 指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,常用在操作主存连续区域的数据时

指 令 包 括 :MOVS , LODS , STOS , CMPS , S

CAS

Page 85: 微机原理及接口技术

● 定义串——指存储器中地址连续的若干单元字符或数据。

串传送指令 串比较指令 串扫描指令串装入指令 串存储指令

8086提供的处理串的指令包含:

串处理指令只能处理单个字节或字,应用中需要串重复前缀配合使用。

由多个字节数据组成的数据串称为字节数据串,简称字节串;由多个字数据组成的数据串称为字数据串,简称字串。组成数据串的字节数据或字数据称为数据串元素。若对数据串元素作同样的操作,就称为串操作。把能完成串操作功能的指令称为数据串操作指令或简称为串操作指令。

5. 串操作指令

Page 86: 微机原理及接口技术

串重复前缀指令: REP(重复 ) 、 REPE/REPZ(相等 / 为零重复 ) 、 REPNE/REPNZ( 不相等 / 不为零重复 ) ;CX 寄存器存放重复操作的次数;一般源串存放在数据段 DS 中,偏移地址由 SI 指定;目的串存放在附加段 ES 中,偏移地址由 DI 指定;设置方向标志指令: CLD ( DF=0 )和 STD ( DF=1 )来设置SI 、 DI偏移地址在重复操作过程中的移动方向。

教学进程

Page 87: 微机原理及接口技术

基本的字符指令● 1.

(1) 串传送指令 MOVS

● 指令功能:把位于数据段 DS:SI 中一个字节或字的数据传送到

附加段 ES:DI 中。

● 指令格式: MOVSB ;传送字节数据

MOVSW ;传送字数据

● 指令操作:

字节操作: (DI) ←((SI)) , SI←(SI)±1 , DI←(DI)±1

字 操 作: (DI) ←((SI)) , SI←(SI)±2 , DI←(DI)±2

(方向标志 DF=0 时用+; DF=1 时用-)

● 本指令对标志位无影响

Page 88: 微机原理及接口技术

(1) MOVS 串传送指令 举例

例:把 DS 数据段 1000H 地址开始的 100 个字节内容顺序传送到扩展段 2000开始的单元中。使用字节串传送指令的程序如下:

MOV SI, 1000H ; 源串首地址 MOV DI, 2000H ; 目的串首地址 MOV CX, 100 ; 字节串长度 CLD ;清除方向标志 LOOP: MOVSB ; 传送一个字节数据 DEC CX ; 字节串长度减 1 JNZ LOOP ;CX 不为 0 ,转到 LOOP 继续执行 HLT

Page 89: 微机原理及接口技术

● 指令功能:将 DS:SI 所指定的字节(或字)单元的内容取出来送入AL (或 AX )中。● 指令格式: LODSB  ;存字节数据 LODSW  ;存字数据● 指令操作: 字节操作: AL←((SI)) , SI←(SI)±1

字 操 作: AX←((SI)) , SI←(SI)±2

(方向标志 DF=0 时用+; DF=1 时用-)

(2) 串装入指令LODS

Page 90: 微机原理及接口技术

(2) LODS 串读取指令 例:已知在数据段中有 100 个字组成的串,现在要求将其中的负数相加,其和

数 存放到紧接着该 串 的 下 一 个顺序 地 址 中 。已知串首元素的偏移 地 址 为2000H 。程序段代码:

CLD MOV SI, 2000H MOV BX, 0 MOV DX, 0 MOV CS, 202 LOOP: DEC CX DEC CX JZ STO ;判断计数是否已完 LODSW ; 从源串中取一个字送 AX MOV BX, AX AND AX, 8000H ;判断是否为负数 JZ LOOP ; 不是负数,转到 LOOP 继续取字串中的一个字 ADD DX, BX ;求负数元素之和,存在 DX 中 JMP LOOP STO: MOV [SI], DX ;负数元素之和写入顺序地址中 HLT

Page 91: 微机原理及接口技术

● 指令功能:将 AL 或 AX 中的数据送入 ES : DI 所指定的目标单元中。● 指令格式: STOSB ; 存字节数据 STOSW ; 存字数据● 指令操作: 字节操作: (DI) ←(AL) , DI←(DI)±1

字 操 作: (DI) ←(AX) , DI←(DI)±2

(方向标志 DF=0 时用+; DF=1 时用-)

(3) 串存储指令 STOS

Page 92: 微机原理及接口技术

(3) STOS 串存入指令 例:内存有一个数据缓冲区起始地址 BLOCK ,共存放

100 个 8 为带符号数,编程实现把该区域内正数、负数分离, 分别送 到同一 段 内 两 个缓冲区内 。正数 存放在PLUS_DATA开始的单元内,负数存放在 MINUS_DATA开始的单元中。

程序段代码: PUSH DS POP ES MOV SI, OFFSET BLOCK MOV DI, OFFSET PLUS_DATA MOV BX, OFFSET MINUS_DATA MOV CX, 100 CLD

Page 93: 微机原理及接口技术

(3) STOS 串存入指令 LOOP1: LODSB TEST AL, 80H JNZ MINUS ; 如果是负数,转到

MINUS STOSB ;否则,存正数 JMP AGAIN MINUS: XCHG BX, DI STOSB ; 存负数 XCHG BX, DI AGAIN: DEC CX JNZ LOOP1 HLT

Page 94: 微机原理及接口技术

(4) 串比较指令 CMPS

● 指令功能:将 ES : DI 指定的单元的内容减去由 DS : SI 指定单元的内容,不送回结果,只影响标志位 CF 、 PF 、 AF 、 ZF 、 SF

和 OF 。● 指令格式: CMPSB  ;比较字节数据 CMPSW  ;比较字数据● 指令操作:① ((DI))-((SI)), 根据比较结果置条件标志位: 相等 ZF=1 ,不等 ZF=0

②字节操作: SI←(SI)±1 , DI←(DI)±1

字 操 作: SI←(SI)±2 , DI←(DI)±2

(方向标志 DF=0 时用+; DF=1 时用-)

Page 95: 微机原理及接口技术

(4) CMPS 串比较指令 例:编程实现比较 DS 段 100H 和 200开始的 100 个

字符是否相同。 程序段代码:

MOV AX, DS MOV ES, AX MOV DI, 200H MOV SI, 300H CLD MOV CX, 100H XOR AX, AX REPZ CMPSB JZ DONE … ; 字符串不相同对应的处理程序段 DONE: … ; 字符串相同对应的处理程序段

Page 96: 微机原理及接口技术

(5)

● 指令功能: AL 或 AX 中的内容与附加段 ES:DI 所指的目的串中的

一个字节(或字)的数据相减,并根据结果设置标

志位,但结果不回送任何单元。

● 指令格式: SCASB  ;比较字节数据

SCASW  ;比较字数据

● 指令操作:字节操作: (AL) - ((DI)), DI←(DI)±1

字 操 作: (AX) - ((DI)), DI←(DI)±2

(方向标志 DF=0 时用+; DF=1 时用-)

串扫描指令 SCAS

Page 97: 微机原理及接口技术

(5) SCAS 串扫描指令 例:寻找字符串中是否包含字符“ A” 。 程序段代码:

MOV DI, OFFSET STRN MOV CX, N ; 串长度 MOV AL, ‘A’ ; 关键字符 CLD AGAIN: SCASB JZ FIND ;找到关键字符,转 FIND DEC CX JNZ AGAIN MOV AL, 0 ;未找到关键字符, AL 置 0 JMP EXIT FIND: MOV AL, 0FFH EXIT: MVO RSLT, AL

Page 98: 微机原理及接口技术

● 指令功能:重复执行指令规定的操作,直到( CX ) =0 。● 指令格式: REP MOVS ( B/W )或 STOS ( B/W )或LODS ( B/W )● 指令操作:① 如( CX ) =0 则退出 REP ,否则转②; ②( CX )←( CX )- 1 ; ③ 执行其后的串操作指令; ④ 重复①~③。

(1) 无条件重复前缀REP

重复前缀● 2.

Page 99: 微机原理及接口技术

(2)

● 指令功能:重复执行指令规定的操作,每执行一次串

指令( CX )- 1 ,并判断 ZF 标志是否为 0 ,

只要( CX ) =0 或 ZF=0 ,则停止执行串操作指令。

● 指 令 格 式 : REPE/REPZ   MOVS ( B/W ) 或

STOS ( B/W )或 LODS ( B/W )

● 指令操作:① 如( CX ) =0 或 ZF=0 则退出,否则转②;

②( CX )←( CX )- 1 ;

③ 执行其后的串操作指令;

④ 重复① ~ ③。

相等或为零时重复串前缀 REPE/REPZ

Page 100: 微机原理及接口技术

例 [4-16]比较首地址分别为 STR1 和 STR2 的两个长度为 50 的字节串,找出第一个不相等的字节(要求用 REPZ 指令实现)。若两串相同,则( BX ) =0 ;若找到不相等的字节,则将 STR1 串中的这个数送到 AL ,基地址送 BX 中。

CLDMOV CX , 100LEA SI , STR1LEA DI , STR2REPZ CMPSBJZ OVERDEC SIMOV BX , SIMOV AL , [SI]JMP STOP

OVER : MOV BX , 0STOP : HLT

Page 101: 微机原理及接口技术

(3)

● 指令功能:重复执行指令规定的操作,每执行一次串

指令( CX )- 1 ,并判断 ZF 标志是否为 1 ,

只要( CX ) =0 或 ZF=1 ,则停止执行串操作指令。

● 指令格式: REPNE/REPNZ

MOVS ( B/W )或 STOS ( B/W )或 LODS ( B/W )

● 指令操作:① 如( CX ) =0 或 ZF=1 则退出,否则转②;

②( CX )←( CX )- 1 ;

③ 执行其后的串操作指令;

④ 重复① ~ ③。

REPNE/REPNZ 不相等或不为零时重复串前缀

注意:在进行串操作前,应当设置好源串地址 DS : SI 、目的串地址ES : DI 、方向标志位 DF 以及重复操作的次数 CX 。