第二节 8086/8088的寻址方式一,概述
1,程序语言简介
2,8086/8088指令简介二,8086/8088的寻址方式
1,立即数寻址
2,寄存器寻址
3,直接寻址
4,寄存器间接寻址
5,寄存器相对寻址
6,基址加变址寄存器
7,相对基址加变址寄存器一,概述
1,程序语言简介
2,8086/8088指令简介
1,程序语言简介
1) 指令,指令系统和程序
2) 机器码和机器语言
3) 助记符和汇编语言
4) 高级语言
▲ 本课程学习汇编语言的目的
1) 指令,指令系统和程序
CPU是一个可以完成一些基本操作的电子器件 。
用编码表示 CPU的 一个基本操作,称为一条 指令 。
全部指令集称为 指令系统 。
指令系统反映 CPU的基本功能,
是硬件设计人员和程序员能见到的 机器的主要属性,
是硬件构成的计算机系统 向外部世界提供的直接界面 。
一个 CPU的指令系统是固定的,
不同类型的 CPU其指令系统不同 ;
同一系列向上兼容 。
程序 是为要解决的问题编写出来的指令集合 。
用户为解决自己的问题所编写的程序称为 源程序 。
2) 机器码和机器语言
用二进制数编码表示的指令,称为 机器指令 或 机器码 。
机器语言 是机器码及其使用的一组规则 。
用机器语言编写的程序称为 目标程序 。
机器语言特点,CPU能 直接识别 的唯一语言面向机器,可直接被计算机执行执行速度快,占用内存空间小编程效率低,可读性差,可移值性差
应用:显示设备简单的单片机家用电器,固化在 ROM上的程序等例 将地址为 2000H和 2001H的两内存单元内容相加,
结果存在地址 2002H单元中,程序如下:
A0 00 20
02 06 01 20
A2 02 20
数据暂存器
PSW标志寄存器 控制电路指令译码器
AX
BX
CX
DX
SI
DI
BP
SP
寄存器组指令队列总线接口控制电路运算器地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
IP
地址加法器
DS
ES
SS
CS 1010 00000000 0000
0010 0000
0000 0010
0000 0110
0000 0001
0010 0000
1010 0010
0000 0010
0010 0000
A0
00
20
02
06
01
20
A2
02
20
3) 助记符和汇编语言
助记符 是有助记忆,并能描述指令功能的符号 。
通常是指令功能的英文单词的缩写 。
例 数的传送指令用助记符 MOV
加法用 ADD,转移用 JMP等
用助记符等表示的指令称为 汇编格式指令例 MOV AL,0
汇编语言 是汇编格式指令,伪指令及其使用的一组规则 。
用汇编语言编写的程序称 汇编语言程序 。
上例 将地址为 2000H和 2001H的两内存单元内容相加,
结果存在地址 2002H单元中 。
汇编格式指令与机器指令一一对应
用汇编语言编好的程序,
必须翻译成机器码表示的程序,计算机才能运行。
汇编程序 是将汇编语言程序翻译成机器语言的一种系统程序 。
用机器码编程:
A0 00 20
02 06 01 20
A2 02 20
用汇编语言编写的确程序段为:
MOV AL,var1
ADD AL,var2
MOV var3,AL
汇编语言和机器语言编写的程序:
面向机器,反映机器运行的实际过程,
与计算机的硬件结构和指令系统密切相关
算法是用计算机的指令,寄存器等描述,
要了解 CPU的 编程结构,寻址方式,指令系统才能设计程序
占内存少,执行速度快
编写繁琐,调试困难
相对于机器语言编写的程序:
汇编语言程序,易读易懂,便于修改 。
3) 高级语言
高级语言 是独立于机器,面向过程或对象的语言 。
算法是按照人的思维方式给出,比较接近人的自然语言 。
上例 高级语言程序段为:
var3 = var1 + var2
由 编译程序 将高级语言源程序翻译目标程序,
即用机器码表示的程序,机器才能执行 。
(不同类型机器由于指令系统不同,它们的编译程序不同 )
Fortran,Basic,C等均是高级语言 。
使用高级语言编程,效率高,可读性,可移植性强 。
本课程学习汇编语言的意义:
汇编语言程序反应机器运行的实际过程,
通过编制汇编语言程序,加深对计算机工作过程的理解 。
本课程涉及到接口电路的设计及应用,
在直接控制硬件的场合,汇编语言比高级语言更具优势,
也可以更好的理解接口工作过程 。
在 第二章 了解 8086/8088CPU的编程结构,寻址方式,
并学习汇编格式的指令系统 ;
在 第三章 学习汇编语言程序设计
2,8086/8088指令简介
指令格式
1) 操作码
2) 操作数
(1)来源 (2)个数 (3)类型 (4)执行速度
指令格式 操作码 操作数例 ADD AL,10H
数据传送算术运算逻辑运算串操作控制转移处理机控制按功能指令分六类
1) 操作码指明 CPU要执行什么样的操作。
是一条指令必不可少的部分,用助记符表示 。
2) 操作数指明参与操作的数据或数据所在的地方 。
了解操作数的 来源,个数,类型,执行速度 。
指令格式 操作码 操作数例 ADD AL,10H
(1) 操作数来源 指明操作数所在的地方有三种来源:
① 操作数在指令中,称 立即数操作数如 MOV AL,9
② 操作数在寄存器中,称 寄存器操作数指令中给出用符号表示的寄存器名。
如 MOV AL,9
③ 操作数在内存单元中,称 存储器操作数 或 内存操作数指令中给出该内存单元的地址。用 [ ]表示存储器操作数如 MOV AL,[ 2000H ]
(2) 操作数个数按指令格式中,操作数个数的多少分为三类:
无操作数,指令只有一个操作码,没有操作数单操作数,指令中给出一个操作数双操作数,指令中给出两个操作数 。
① 无操作数,指令只有一个操作码,没有操作数 。
有两种可能:
▲ 有些操作不需要操作数。
如 HLT,NOP等处理机控制指令。
▲ 操作数隐含在指令中。
如 STC,CLC等处理机控制命令。
AAA,DAA等调整指令。
② 单操作数,指令中给出一个操作数 。
有两种可能:
▲ 有些操作只需要一个操作数如 INC AL ; ( AL) ← ( AL) + 1
▲ 有些操作将另一个操作数隐含在指令中如 MUL BL ; ( AX) ← ( AL) × ( BL)
③ 双操作数,指令中给出两个操作数 。
如 ADD AL,BL ; (AL) ← (AL) + (BL)
目的操作数 源操作数操作后的结果通常存放在目的操作数中 。
3) 操作数类型指令应指明 参与操作的数是字节还是字,即 操作数的类型 。
通常操作数的类型可由操作数本身隐含给出。
只在特殊情况下需要指明。
8086/8088:
有的操作既可对 字节操作,又可对字操作有的操作只允许 对字操作
① 指令中有寄存器操作数,由寄存器操作数决定类型 。
例,MOV [BX],AL ;字节操作,[BX] ← AL
MOV [BX],AX ;字操作,[BX] ←AL,[BX+1] ←AH
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
1693:0100 MOV [BX],AL
1693:0102 MOV [BX],AX
1693:0104
-U 100? ;返汇编指令
1693:0100 8807 MOV [BX],AL
1693:0102 8907 MOV [BX],AX
、、、、、、
在 DEBUG下查看指令对应的机器码:
两条指令的机器码不同,一个是 0788H,另一个是 0789H
② 指令操作数中无寄存器,则 由内存操作数的类型决定 。
value 00H
…,
内存
value 00H
00H
例 value 是一个变量 (即内存操作数 );
若定义 value 为字节类型,
则 MOV value,0 是字节操作。
若定义 value 为字类型,
则 MOV value,0 是一个字操作 。
例 MOV [ BX ],0
③ 指令中无类型的依据,需对存储器操作数加类型说明。
用 PTR 属性伪操作说明类型。
MOV byte PTR [BX],0
字节操作,[ BX ] ← 0
MOV word PTR [BX],0
字操作,[ BX ] ← 0,[ BX+1 ] ← 0
4) 执行速度寄存器操作数 立即数操作数 存储器操作数例 mov AL,BL
mov AL,0
mov AL,[ BX ]
哪条指令执行速度快?
三条指令:
操作类型相同,都是传送指令,且目的操作数相同,
不同的是源操作数。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存
mov AL,BL
mov AL,0
mov AL,[ BX ]
对同一类型指令,执行速度:
寄存器操作数 立即数操作数 存储器操作数快 慢例 mov AL,BL 快
mov AL,0
mov AL,[ BX ] 慢二,8086/8088的寻址方式指明操作数的来源,即寻找 ( 得到 ) 操作数的方法 。
共 7种寻址方式,
1,立即数寻址
2,寄存器寻址
3,直接寻址
4,寄存器间接寻址 5种与内存单元
5,寄存器相对寻址 有关的寻址
6,基址加变址寄存器寻址 (存储器操作数 )
7,相对基址加变址寄存器寻址以 数据传送指令 MOV为例介绍寻址方式 。
指令 MOV dst,src
执行 ( dst) ← ( src)
即,源操作数的内容不变,
目的操作数 = 源操作数
1,立即数寻址
操作数在指令中,取来指令立即可得到操作数 。
称该操作数为立即数 。
立即数可以是 8位或 16位 。
立即数常用来给寄存器或内存单元赋初值 。
56
B8
内存
20
数作操操作码例 1 MOV AX,2056H
结果 ( AH ) = 20H
( AL ) = 56H
例 2 MOV AL,78 H
结果 ( AL ) = 78H
2,寄存器寻址方式
操作数在寄存器中,指令中指定寄存器名
8 位操作数,用 8 位寄存器,
AH,AL,BH,BL,CH,CL,DH,DL
16 位操作数,用 16 位寄存器,
AX,BX,CX,DX,SP,BP,SI,DI
CS,DS,SS,ES
例 1 MOV AX,2056H
执行后,(AX)=2056H
例 2 MOV BL,AH
执行前,(BL) = 12H,(AH) = 78H
执行后,(BL) = 78H (AH) = 78H
▲ 立即数寻址,寄存器寻址的操作数,
不用在取完指令后再到内存中取数 。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存
▲ 以下的 5 中寻址方式,
操作数存放在内存中,取完指令后,还需到内存取数 。
指令中给出的是该操作数的地址,包括段地址和偏移地址 。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例 编程将 CL寄存器的内容传送到 21000H单元中。
MOV AX,2000H
MOV DS,AX ; (DS) = 2000H
MOV DI,1000H ; (DI) = 1000H
MOV DS,[ DI ],CL ;(21000H) = (CL)
地址 21000H= 2000,1000H
编程时,DS 存放段地址 2000H
DI 存放偏移地址 1000H
如指令 MOV DS,[ DI ],CL
完成将 CL寄存器中的内容传送到以 DS为段值,DI为偏移值的内存单元中数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
SI
DI
BP
SP
寄存器组指令队列总线接口控制电路运算器地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
21000H
21001H
21002H
IP
地址加法器
DS
ES
SS
CSA0
通过例子看到:
在相应的寄存器中设定段值和偏移值,
由地址加法器送出 20位的地址信号,对选中的内存单元进行操作 。
1000
21000 MOV AX,2000H
MOV DS,AX
MOV DI,1000H
MOV DS,[ DI ],CL
2000
2000
A0
内存单元的地址由 段地址和偏移地址 构成
▲ 为减短指令长度指令中只给出偏移地址的来源,段地址由默认关系给出。
MOV AL,[ 2000H ]
▲ CPU根据偏移地址给出的方式,
按默认关系自动选择段寄存器,获取段值,
由段值、偏移值构成操作数所在内存单元的物理地址。
上例 PA= ( DS ) × 10H + 2000H
即选择 DS寄存器的内容为段地址。
指令中用 [ ] 给出偏移地址 。
操作数的偏移地址又称 有效地址 EA( Efficient Address)
▲ 按给出偏移地址方式的不同,分为以下 5种:
直接寻址 MOV AL,[ 1000H ]
寄存器间接寻址 MOV AL,[ BX ]
寄存器相对寻址 MOV AL,[ BX + 10H ]
基址加变址寄存器 MOV AL,[ BX + SI ]
相对基址加变址寄存器 MOV AL,[ BX + SI + 10H ]
3,直接寻址方式
存储器操作数的有效地址 EA在指令中直接给出 。
例 MOV AL,[ 1000H ]
默认段寄存器为 DS。
操作数所在内存单元的物理地址为:
PA = ( DS )× 10H + EA
直接寻址方式默认段寄存器为 DS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例,MOV AX,[ 1000 H]
若 ( DS ) = 2000H
内存操作数的物理地址为:
PA = ( DS )× 10H +EA
= 2000H × 10H + 1000H
= 21000H
执行后 (AX)= 3040H
21000 40
00
A1
内存
10
30
指令
在汇编语言程序中,不直接用数值 表示偏移地址,
用符号代替数值表示地址,称 符号地址 (变量名 )。
buffer 0A
0B例 符号 buffer表示一个地址。
MOV AX,[buffer]
或写成 MOV AX,buffer
源操作数为 buffer指向的内存单元的内容符号地址 ( 变量名 )经汇编连接后,与一个确定的数值地址相对应可用 操作符 Offset 获取变量的偏移地址。
故 PA = ( DS )× 10H + Offset buffer
指令执行结果 ( AX ) = 0B0A H
4,寄存器间接寻址
存储器操作数的有效地址 EA由寄存器给出,
寄存器的内容为操作数的有效地址 。
可用的寄存器有 BX,SI,DI,BP
如,MOV AL,[ BX ]
MOV AH,[ SI ]
MOV DL,[ DI ]
MOV DH,[ BP ]
默认段寄存器的关系:
① 使用 BX,SI,DI,默认段寄存器为 DS
(BX)
PA = ( DS )× 10H + (SI)
(DI)
② 使用 BP,默认段寄存器为 SS
PA = ( SS )× 10H + ( BP )
使用 BX,SI,DI的寄存器寻址,默认段寄存器为 DS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存使用 BP的寄存器寻址,默认段寄存器为 SS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例,MOV AX,[ DI ]
若 ( DS ) = 3000H
( DI ) = 2000H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( DI )
= 32000H
执行后 (AX) = (32000H) = 400BH
32 000 0B
05
8B
指 令
40
例,MOV AX,[ BP ]
若 ( SS ) = 4000H
( BP ) = 3000H
则内存操作数的物理地址为:
PA = ( SS )× 10H + ( BP )
= 43000H
指令执行后 (AX) = (43000H) = 0102H
43 000 02
46
8B
指 令
01
5,寄存器相对寻址
操作数的有效地址由一个寄存器与一个偏移量相加得到偏移量 ( 相对量 ) 在指令中给出,范围在 0000 ~ FFFFH
可用的寄存器有 BX,DI,SI,BP,与寄存器间接寻址相同如,MOV AL,[ BX +10H]
MOV AH,[ DI+20H ]
MOV DL,30H [ SI ]
MOV DH,40H [ BP ]
默认段寄存器的关系与寄存器间接寻址相同
① 使用 BX,SI,DI,默认段寄存器为 DS
(BX)
PA = ( DS )× 10H + (SI) + 偏移量
(DI)
② 使用 BP,默认段寄存器为 SS
PA = ( SS )× 10H + ( BP ) + 偏移量例,MOV AX,[ BX+30H ]
若 ( DS ) = 2000H
( BX ) = 1000H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( BX ) + 30H
= 21030H
指令执行后:
(AX) = (21030H) = 8976H
21030 76
30
47指 令
89
8B
例,MOV AX,60H [ BP ]
若 ( SS ) = 3000H
( BP ) = 200H
则内存操作数的物理地址为:
PA = ( SS )× 10H + ( BP ) + 60H
= 30260H
指令执行后:
(AX) = (30260H) = 0ABCH
30260 BC
60
46
指 令
0A
8B
6,基址加变址寻址
操作数的有效地址由一个基址寄存器与一个变址寄存器之和给出 。
可用的基址寄存器为 BX,BP
变址寄存器为 SI,DI
如 MOV AL,[ BX+SI ]
MOV AX,[ BX][DI ]
MOV DL,[ BP+SI ]
MOV DX,[ BP][DI ]
默认段寄存器由基址寄存器决定 。
① 基址寄存器为 BX,默认段寄存器为 DS
(SI)
PA = ( DS )× 10H + ( BX ) +
(DI)
② 基址寄存器为 BP,默认段寄存器为 SS
(SI)
PA = ( SS )× 10H + ( BP ) +
(DI)
使用 BX的基址加变址寻址,默认段寄存器为 DS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存使用 BP的基址加变址寻址,默认段寄存器为 SS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例,MOV AX,[ BX + SI ]
若 ( DS ) = 4000H
( BX ) = 2000H
( SI ) = 100H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( BX ) + ( SI )
= 42100H
指令执行后
(AX) = (42100H) = 2345H
42100 45
0 0
8B指 令
23
7,相对基址加变址寻址
操作数的有效地址由基址寄存器,变址寄存器,偏移量三者之和给出 。
可用的寄存器与基址加变址寻址方式相同基址寄存器有 BX,BP
变址寄存器有 SI,DI
如 MOV AL,[ BX+SI +10H]
MOV AX,20H[ BX][DI ]
MOV DL,[ BP+SI+30H ]
MOV DX,40H[ BP][DI ]
默认段寄存器由基址寄存器决定,与基址加变址寻址相同
① 基址寄存器为 BX,默认段寄存器为 DS
(SI)
PA = ( DS )× 10H + ( BX ) + + 偏移量
(DI)
② 基址寄存器为 BP,默认段寄存器为 SS
(SI)
PA = ( SS )× 10H + ( BP ) + + 偏移量
(DI)
例,MOV AX,[ BX + SI + 10H ]
若 ( DS ) = 4000H
( BX ) = 3000H
( SI ) = 200H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( BX ) + ( SI ) + 10H
= 43210H
指令执行后
(AX) = (43210H) = 8877H
43210 77
10
40指 令
88
8B
实验:利用 DEBUG学习寻址方式在 DEBUG下汇编下列指令,并查看每条指令执行后的结果,
MOV BX,2000h
MOV [BX],CS
思考,如何查看指令 MOV [BX],CS 执行后的结果?
用 R命令可以吗?
操作数 [BX]在哪里?
它的内存地址如何构成?
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
126C:0100 MOV BX,2000?
126C:0103 MOV [BX],CS?
126C:0105?
-R? ;查看指令执行前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0100 NV UP EI PL NZ NA PO NC
126C:0100 B83412 MOV AX,1234
-D DS:2000 L20? ;查看指令执行前内存单元的内容
126C:2000 00 44 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4,D.!..4....t3.3.
126C:2010 24 0C 75 09 A0 51 DC 0A-06 4D DC 74 19 7A 21 A8 $.u..Q...M.t.z!.
-T=100? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0103 NV UP EI PL NZ NA PO NC
126C:0103 8C0F MOV [BX],CS DS:2000=4400
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0105 NV UP EI PL NZ NA PO NC
126C:0105 0475 ADD AL,75
-D DS:2000 L10? ;查看指令执行后内存单元的内容
126C:2000 6C 12 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4 l..!..4....t3.3.
-Q?
寻址方式的几点说明
1,偏移量可用符号地址给出例,MOV AX,mask [ BX ]
若 ( DS) = 1000H
( BX) = 300H
OFFSET mask = 2000H
PA = ( DS ) × 10H + ( BX )
+ OFFSET mask
= 12300H
执行后 ( AX ) = 6B5A H
1230 0 5A
33
22
mask
12000
6B
11
2,段跨越前缀的使用
段跨越前缀在指令中出现的指定内存单元段地址的段寄存器符号。
表示方法为 段寄存器名,
例,MOV AX,ES,[ BX ]
ES,MOV AX,[ BX ] ( DEBUG下格式 )
为减小指令长度,CPU采用默认关系获取段地址。
使用段跨越前缀可强行改变这种默认关系。
使用段跨越前缀的指令比不使用的指令要多占一个字节 。
8B
07
指 令 M O V AX,ES,[B X]
26
指 令 M O V A X,[B X ]
8B
07
使用段跨越前缀的物理地址计算例,MOV AX,ES,[ BX ]
使用段跨越的前缀后,段地址由指定的段寄存器给出,
不再遵循默认关系。
PA =( ES) × 10H + ( BX)
而不等于 ≠ ( DS) × 10H + ( BX)
只有存储器操作数需用段跨越的前缀
ES,MOV [SI],CX
DS,MOV AL,[BP]
MOV ES,AX,0
CS,MOV CX,22H
3,不自创寻址方式内存操作数地址只能由 BX,BP,SI,DI给出,
它们的组合也不是任意的 。
基址加变址
[ BX +SI ]
[ BX +DI]
[ BP +SI ]
[ BP +DI]
寄存器相对
[SI + X ]
[DI + X ]
[BX + X ]
[BP + X ]
寄存器间接
[SI ]
[DI ]
[BX ]
[BP ]
相对基址加变址
[ BX +SI+ X ]
[ BX +DI+ X]
[ BP +SI+ X ]
[ BP +DI+ X]
X 为 8 位或 16 位偏移量除此之外,其他方式均错误 。
如 MOV CL,[AX]
MOV AX,[DX]
MOV AL,[CX]
MOV CX,[BP+BX]
MOV AH,[SI+DI]
MOV BL,[AX+CX]
D:\>DEBUG?
-A?
0AFA:0100 MOV CL,[AX]?
^ Error
0AFA:0100 MOV AX,[DX]?
^ Error
0AFA:0100 MOV AL,[CX]?
^ Error
0AFA:0100 MOV CX,[BP+BX]?
^ Error
0AFA:0100 MOV AH,[SI+DI]?
^ Error
0AFA:0100 MOV BL,[AX+CX]?
^ Error
0AFA:0100?
-
利用 DEBUG可判断下列寻址方式错:
第三节 8086/8088的指令系统一,概述二,数据传送指令三,算术运算指令四,逻辑运算指令五,控制转移指令六,处理机控制指令七,串操作指令一.概述
1,指令助记符表
2,学习指令的要点
3,利用 DEBUG程序,学习指令系统
4,指令中操作数的表示
5,书写指令注意事项指令类型 助记符通用传送 M OV,P USH,P OP,XC HG,XL A T
地址传送 LEA,L DS,L ES
标志传送 PU SH F,PO PF,LA HF,SAH F
数据传送 输入输出 IN,O UT
加法 ADD,ADC,INC,AAA,DA A
减法 SUB,SBB,DE C,N EG,CM P,AA S,DA S
乘法 M UL,IM UL,AAM
除法 DIV,IDI V,A AD
算术运算符号扩展 CBW,CW D
逻辑运算 AND,TE ST,O R,XO R,N OT
移位 SH L,SAL,SH R,SA R
逻辑操作循环移位 RO L,RO R,R CL,R CR
1,指令助记符表指令类型 助记符串操作 MO VS,CM PS,SCAS,L ODS,ST OS串处理 重复控制 REP,REP E/ REP Z,RE PNE /RE PNZ
无条件转移 JM P
条件转移
JE /JZ,JNE /JNZ,JS,J NS,JO,JNO
JP,JNP,JC,J NC,JCXZ
JA / JNBE,JAE/ JNB,JB /JNAE,JB E/ JNA
JG /JNL E,J GE /JNL,J L/ JNG E,J LE/J NG
循环控制 LO OP,LOO PE /LO OPZ,LOO PNE /LO OPNZ
过程调用 CALL,RET
控制转移中断指令 INT,INT O,IRET
处理机控制
CLC,S TC,CM C,CLD,S T D,CLI,S T I
NOP,H L T,W AIT,ES C,LO CK
2,学习指令的要点从以下几个方面来掌握一条指令,
指令的助记符
指令的格式,操作数的个数、类型
执行的操作,指令执行后的结果包括,哪些寄存器、内存单元的值发生了变化对标志位有无影响,哪些受影响
特点及注意事项只介绍常用的指令,其他需要时可自学 。
3,利用 DEBUG学习寻址方式、指令系统(示例)
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
126C:0100 MOV BX,2000
126C:0103 MOV [BX],CS
126C:0105
-R? ;查看指令执行前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0100 NV UP EI PL NZ NA PO NC
126C:0100 B83412 MOV AX,1234
-D DS:2000 L20? ;查看指令执行前内存单元的内容
126C:2000 00 44 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4,D.!..4....t3.3.
126C:2010 24 0C 75 09 A0 51 DC 0A-06 4D DC 74 19 7A 21 A8 $.u..Q...M.t.z!.
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0103 NV UP EI PL NZ NA PO NC
126C:0103 8C0F MOV [BX],CS DS:2000=4400
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0105 NV UP EI PL NZ NA PO NC
126C:0105 0475 ADD AL,75
-D DS:2000 L10? ;查看指令执行后内存单元的内容
126C:2000 6C 12 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4 l..!..4....t3.3.
-Q?
4,指令中操作数的表示符号 表示内容
dat a 立即数操作数
r eg
通用寄存器操作数
8 位,AH,AL,BH,BL,CH,CL,DH,DL
16 位,AX,BX,CX,DX,BP,SP,SI,DI
seg r eg 段寄存器 CS,DS,SS,ES
mem
或 [ ]
存储器操作数 ( 5 种寻址方式)
sr c 源操作数
dst 目的操作数
( ) 寄存器、存储器、端口的内容
oprd1
oprd2
两操作数
5,书写指令注意事项:
不区分字母的大小写 。
下列写法表示同一条指令:
MOV AX,1ABDH
mov ax,1abdh
不添加指令系统没有的指令,即不自创助记符 。
将 MOV AL,0 写成 MOVE AL,0
JMP lable 写成 JUMP lable
注意操作数的范围对字节操作指令 0 ~ FFH 0 ~ 255
对字操作指令 0 ~ FFFFH 0 ~ 65535
MOV AL,260
MOV AX,70000
MOV AL,1FFH
MOV AL,2ABCDH
对无操作数指令,不添加操作数 。
STC AL
对单操作数指令,操作数不能是立即数 。
IMUL 6
对双操作数指令
① 不能两个同为存储器操作数
MOV [ DI ],[ SI ]
② 目的操作数不能是立即数
ADD 3,AL
③ 两个操作数的类型应相同
SUB AX,BL
若 value 定义为字类型存储器变量:
MOV CL,value [ BX ]
内存操作数的属性应明确 。
MOV [ BX ],0
MOV byte ptr [ BX ],0
MOV word ptr [ BX ],0
MOV [ BX ],AL
MOV [ BX ],AX
A,B,C,D,E,F开头的十六进制数前面加 0,
与 H结尾的标识符区别 。
如 寄存器名 AH,BH,CH,DH
变量名 abcdH 等例 mov AL,0AH
mov AL,AH
mov BX,0abcdH
CS 和 IP的值只在 控制转移指令 中修改。
对非控制转移指令,取完指令后 IP值自动 指向下条指令。
段寄存器 CS的值,只在 MOV,PUSH中可作操作数,
且这两条指令执行结果不改变 CS值。
MOV AX,CS
PUSH CS
IP,PSW两个寄存器不作为操作数在指令中出现。
mov IP,1234H
mov PSW,0F0FH
PSW状态寄存器的值由指令执行后确定,
不同的指令对各标志的影响不同。
1,程序语言简介
2,8086/8088指令简介二,8086/8088的寻址方式
1,立即数寻址
2,寄存器寻址
3,直接寻址
4,寄存器间接寻址
5,寄存器相对寻址
6,基址加变址寄存器
7,相对基址加变址寄存器一,概述
1,程序语言简介
2,8086/8088指令简介
1,程序语言简介
1) 指令,指令系统和程序
2) 机器码和机器语言
3) 助记符和汇编语言
4) 高级语言
▲ 本课程学习汇编语言的目的
1) 指令,指令系统和程序
CPU是一个可以完成一些基本操作的电子器件 。
用编码表示 CPU的 一个基本操作,称为一条 指令 。
全部指令集称为 指令系统 。
指令系统反映 CPU的基本功能,
是硬件设计人员和程序员能见到的 机器的主要属性,
是硬件构成的计算机系统 向外部世界提供的直接界面 。
一个 CPU的指令系统是固定的,
不同类型的 CPU其指令系统不同 ;
同一系列向上兼容 。
程序 是为要解决的问题编写出来的指令集合 。
用户为解决自己的问题所编写的程序称为 源程序 。
2) 机器码和机器语言
用二进制数编码表示的指令,称为 机器指令 或 机器码 。
机器语言 是机器码及其使用的一组规则 。
用机器语言编写的程序称为 目标程序 。
机器语言特点,CPU能 直接识别 的唯一语言面向机器,可直接被计算机执行执行速度快,占用内存空间小编程效率低,可读性差,可移值性差
应用:显示设备简单的单片机家用电器,固化在 ROM上的程序等例 将地址为 2000H和 2001H的两内存单元内容相加,
结果存在地址 2002H单元中,程序如下:
A0 00 20
02 06 01 20
A2 02 20
数据暂存器
PSW标志寄存器 控制电路指令译码器
AX
BX
CX
DX
SI
DI
BP
SP
寄存器组指令队列总线接口控制电路运算器地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
IP
地址加法器
DS
ES
SS
CS 1010 00000000 0000
0010 0000
0000 0010
0000 0110
0000 0001
0010 0000
1010 0010
0000 0010
0010 0000
A0
00
20
02
06
01
20
A2
02
20
3) 助记符和汇编语言
助记符 是有助记忆,并能描述指令功能的符号 。
通常是指令功能的英文单词的缩写 。
例 数的传送指令用助记符 MOV
加法用 ADD,转移用 JMP等
用助记符等表示的指令称为 汇编格式指令例 MOV AL,0
汇编语言 是汇编格式指令,伪指令及其使用的一组规则 。
用汇编语言编写的程序称 汇编语言程序 。
上例 将地址为 2000H和 2001H的两内存单元内容相加,
结果存在地址 2002H单元中 。
汇编格式指令与机器指令一一对应
用汇编语言编好的程序,
必须翻译成机器码表示的程序,计算机才能运行。
汇编程序 是将汇编语言程序翻译成机器语言的一种系统程序 。
用机器码编程:
A0 00 20
02 06 01 20
A2 02 20
用汇编语言编写的确程序段为:
MOV AL,var1
ADD AL,var2
MOV var3,AL
汇编语言和机器语言编写的程序:
面向机器,反映机器运行的实际过程,
与计算机的硬件结构和指令系统密切相关
算法是用计算机的指令,寄存器等描述,
要了解 CPU的 编程结构,寻址方式,指令系统才能设计程序
占内存少,执行速度快
编写繁琐,调试困难
相对于机器语言编写的程序:
汇编语言程序,易读易懂,便于修改 。
3) 高级语言
高级语言 是独立于机器,面向过程或对象的语言 。
算法是按照人的思维方式给出,比较接近人的自然语言 。
上例 高级语言程序段为:
var3 = var1 + var2
由 编译程序 将高级语言源程序翻译目标程序,
即用机器码表示的程序,机器才能执行 。
(不同类型机器由于指令系统不同,它们的编译程序不同 )
Fortran,Basic,C等均是高级语言 。
使用高级语言编程,效率高,可读性,可移植性强 。
本课程学习汇编语言的意义:
汇编语言程序反应机器运行的实际过程,
通过编制汇编语言程序,加深对计算机工作过程的理解 。
本课程涉及到接口电路的设计及应用,
在直接控制硬件的场合,汇编语言比高级语言更具优势,
也可以更好的理解接口工作过程 。
在 第二章 了解 8086/8088CPU的编程结构,寻址方式,
并学习汇编格式的指令系统 ;
在 第三章 学习汇编语言程序设计
2,8086/8088指令简介
指令格式
1) 操作码
2) 操作数
(1)来源 (2)个数 (3)类型 (4)执行速度
指令格式 操作码 操作数例 ADD AL,10H
数据传送算术运算逻辑运算串操作控制转移处理机控制按功能指令分六类
1) 操作码指明 CPU要执行什么样的操作。
是一条指令必不可少的部分,用助记符表示 。
2) 操作数指明参与操作的数据或数据所在的地方 。
了解操作数的 来源,个数,类型,执行速度 。
指令格式 操作码 操作数例 ADD AL,10H
(1) 操作数来源 指明操作数所在的地方有三种来源:
① 操作数在指令中,称 立即数操作数如 MOV AL,9
② 操作数在寄存器中,称 寄存器操作数指令中给出用符号表示的寄存器名。
如 MOV AL,9
③ 操作数在内存单元中,称 存储器操作数 或 内存操作数指令中给出该内存单元的地址。用 [ ]表示存储器操作数如 MOV AL,[ 2000H ]
(2) 操作数个数按指令格式中,操作数个数的多少分为三类:
无操作数,指令只有一个操作码,没有操作数单操作数,指令中给出一个操作数双操作数,指令中给出两个操作数 。
① 无操作数,指令只有一个操作码,没有操作数 。
有两种可能:
▲ 有些操作不需要操作数。
如 HLT,NOP等处理机控制指令。
▲ 操作数隐含在指令中。
如 STC,CLC等处理机控制命令。
AAA,DAA等调整指令。
② 单操作数,指令中给出一个操作数 。
有两种可能:
▲ 有些操作只需要一个操作数如 INC AL ; ( AL) ← ( AL) + 1
▲ 有些操作将另一个操作数隐含在指令中如 MUL BL ; ( AX) ← ( AL) × ( BL)
③ 双操作数,指令中给出两个操作数 。
如 ADD AL,BL ; (AL) ← (AL) + (BL)
目的操作数 源操作数操作后的结果通常存放在目的操作数中 。
3) 操作数类型指令应指明 参与操作的数是字节还是字,即 操作数的类型 。
通常操作数的类型可由操作数本身隐含给出。
只在特殊情况下需要指明。
8086/8088:
有的操作既可对 字节操作,又可对字操作有的操作只允许 对字操作
① 指令中有寄存器操作数,由寄存器操作数决定类型 。
例,MOV [BX],AL ;字节操作,[BX] ← AL
MOV [BX],AX ;字操作,[BX] ←AL,[BX+1] ←AH
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
1693:0100 MOV [BX],AL
1693:0102 MOV [BX],AX
1693:0104
-U 100? ;返汇编指令
1693:0100 8807 MOV [BX],AL
1693:0102 8907 MOV [BX],AX
、、、、、、
在 DEBUG下查看指令对应的机器码:
两条指令的机器码不同,一个是 0788H,另一个是 0789H
② 指令操作数中无寄存器,则 由内存操作数的类型决定 。
value 00H
…,
内存
value 00H
00H
例 value 是一个变量 (即内存操作数 );
若定义 value 为字节类型,
则 MOV value,0 是字节操作。
若定义 value 为字类型,
则 MOV value,0 是一个字操作 。
例 MOV [ BX ],0
③ 指令中无类型的依据,需对存储器操作数加类型说明。
用 PTR 属性伪操作说明类型。
MOV byte PTR [BX],0
字节操作,[ BX ] ← 0
MOV word PTR [BX],0
字操作,[ BX ] ← 0,[ BX+1 ] ← 0
4) 执行速度寄存器操作数 立即数操作数 存储器操作数例 mov AL,BL
mov AL,0
mov AL,[ BX ]
哪条指令执行速度快?
三条指令:
操作类型相同,都是传送指令,且目的操作数相同,
不同的是源操作数。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存
mov AL,BL
mov AL,0
mov AL,[ BX ]
对同一类型指令,执行速度:
寄存器操作数 立即数操作数 存储器操作数快 慢例 mov AL,BL 快
mov AL,0
mov AL,[ BX ] 慢二,8086/8088的寻址方式指明操作数的来源,即寻找 ( 得到 ) 操作数的方法 。
共 7种寻址方式,
1,立即数寻址
2,寄存器寻址
3,直接寻址
4,寄存器间接寻址 5种与内存单元
5,寄存器相对寻址 有关的寻址
6,基址加变址寄存器寻址 (存储器操作数 )
7,相对基址加变址寄存器寻址以 数据传送指令 MOV为例介绍寻址方式 。
指令 MOV dst,src
执行 ( dst) ← ( src)
即,源操作数的内容不变,
目的操作数 = 源操作数
1,立即数寻址
操作数在指令中,取来指令立即可得到操作数 。
称该操作数为立即数 。
立即数可以是 8位或 16位 。
立即数常用来给寄存器或内存单元赋初值 。
56
B8
内存
20
数作操操作码例 1 MOV AX,2056H
结果 ( AH ) = 20H
( AL ) = 56H
例 2 MOV AL,78 H
结果 ( AL ) = 78H
2,寄存器寻址方式
操作数在寄存器中,指令中指定寄存器名
8 位操作数,用 8 位寄存器,
AH,AL,BH,BL,CH,CL,DH,DL
16 位操作数,用 16 位寄存器,
AX,BX,CX,DX,SP,BP,SI,DI
CS,DS,SS,ES
例 1 MOV AX,2056H
执行后,(AX)=2056H
例 2 MOV BL,AH
执行前,(BL) = 12H,(AH) = 78H
执行后,(BL) = 78H (AH) = 78H
▲ 立即数寻址,寄存器寻址的操作数,
不用在取完指令后再到内存中取数 。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存
▲ 以下的 5 中寻址方式,
操作数存放在内存中,取完指令后,还需到内存取数 。
指令中给出的是该操作数的地址,包括段地址和偏移地址 。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例 编程将 CL寄存器的内容传送到 21000H单元中。
MOV AX,2000H
MOV DS,AX ; (DS) = 2000H
MOV DI,1000H ; (DI) = 1000H
MOV DS,[ DI ],CL ;(21000H) = (CL)
地址 21000H= 2000,1000H
编程时,DS 存放段地址 2000H
DI 存放偏移地址 1000H
如指令 MOV DS,[ DI ],CL
完成将 CL寄存器中的内容传送到以 DS为段值,DI为偏移值的内存单元中数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
SI
DI
BP
SP
寄存器组指令队列总线接口控制电路运算器地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
21000H
21001H
21002H
IP
地址加法器
DS
ES
SS
CSA0
通过例子看到:
在相应的寄存器中设定段值和偏移值,
由地址加法器送出 20位的地址信号,对选中的内存单元进行操作 。
1000
21000 MOV AX,2000H
MOV DS,AX
MOV DI,1000H
MOV DS,[ DI ],CL
2000
2000
A0
内存单元的地址由 段地址和偏移地址 构成
▲ 为减短指令长度指令中只给出偏移地址的来源,段地址由默认关系给出。
MOV AL,[ 2000H ]
▲ CPU根据偏移地址给出的方式,
按默认关系自动选择段寄存器,获取段值,
由段值、偏移值构成操作数所在内存单元的物理地址。
上例 PA= ( DS ) × 10H + 2000H
即选择 DS寄存器的内容为段地址。
指令中用 [ ] 给出偏移地址 。
操作数的偏移地址又称 有效地址 EA( Efficient Address)
▲ 按给出偏移地址方式的不同,分为以下 5种:
直接寻址 MOV AL,[ 1000H ]
寄存器间接寻址 MOV AL,[ BX ]
寄存器相对寻址 MOV AL,[ BX + 10H ]
基址加变址寄存器 MOV AL,[ BX + SI ]
相对基址加变址寄存器 MOV AL,[ BX + SI + 10H ]
3,直接寻址方式
存储器操作数的有效地址 EA在指令中直接给出 。
例 MOV AL,[ 1000H ]
默认段寄存器为 DS。
操作数所在内存单元的物理地址为:
PA = ( DS )× 10H + EA
直接寻址方式默认段寄存器为 DS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例,MOV AX,[ 1000 H]
若 ( DS ) = 2000H
内存操作数的物理地址为:
PA = ( DS )× 10H +EA
= 2000H × 10H + 1000H
= 21000H
执行后 (AX)= 3040H
21000 40
00
A1
内存
10
30
指令
在汇编语言程序中,不直接用数值 表示偏移地址,
用符号代替数值表示地址,称 符号地址 (变量名 )。
buffer 0A
0B例 符号 buffer表示一个地址。
MOV AX,[buffer]
或写成 MOV AX,buffer
源操作数为 buffer指向的内存单元的内容符号地址 ( 变量名 )经汇编连接后,与一个确定的数值地址相对应可用 操作符 Offset 获取变量的偏移地址。
故 PA = ( DS )× 10H + Offset buffer
指令执行结果 ( AX ) = 0B0A H
4,寄存器间接寻址
存储器操作数的有效地址 EA由寄存器给出,
寄存器的内容为操作数的有效地址 。
可用的寄存器有 BX,SI,DI,BP
如,MOV AL,[ BX ]
MOV AH,[ SI ]
MOV DL,[ DI ]
MOV DH,[ BP ]
默认段寄存器的关系:
① 使用 BX,SI,DI,默认段寄存器为 DS
(BX)
PA = ( DS )× 10H + (SI)
(DI)
② 使用 BP,默认段寄存器为 SS
PA = ( SS )× 10H + ( BP )
使用 BX,SI,DI的寄存器寻址,默认段寄存器为 DS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存使用 BP的寄存器寻址,默认段寄存器为 SS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例,MOV AX,[ DI ]
若 ( DS ) = 3000H
( DI ) = 2000H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( DI )
= 32000H
执行后 (AX) = (32000H) = 400BH
32 000 0B
05
8B
指 令
40
例,MOV AX,[ BP ]
若 ( SS ) = 4000H
( BP ) = 3000H
则内存操作数的物理地址为:
PA = ( SS )× 10H + ( BP )
= 43000H
指令执行后 (AX) = (43000H) = 0102H
43 000 02
46
8B
指 令
01
5,寄存器相对寻址
操作数的有效地址由一个寄存器与一个偏移量相加得到偏移量 ( 相对量 ) 在指令中给出,范围在 0000 ~ FFFFH
可用的寄存器有 BX,DI,SI,BP,与寄存器间接寻址相同如,MOV AL,[ BX +10H]
MOV AH,[ DI+20H ]
MOV DL,30H [ SI ]
MOV DH,40H [ BP ]
默认段寄存器的关系与寄存器间接寻址相同
① 使用 BX,SI,DI,默认段寄存器为 DS
(BX)
PA = ( DS )× 10H + (SI) + 偏移量
(DI)
② 使用 BP,默认段寄存器为 SS
PA = ( SS )× 10H + ( BP ) + 偏移量例,MOV AX,[ BX+30H ]
若 ( DS ) = 2000H
( BX ) = 1000H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( BX ) + 30H
= 21030H
指令执行后:
(AX) = (21030H) = 8976H
21030 76
30
47指 令
89
8B
例,MOV AX,60H [ BP ]
若 ( SS ) = 3000H
( BP ) = 200H
则内存操作数的物理地址为:
PA = ( SS )× 10H + ( BP ) + 60H
= 30260H
指令执行后:
(AX) = (30260H) = 0ABCH
30260 BC
60
46
指 令
0A
8B
6,基址加变址寻址
操作数的有效地址由一个基址寄存器与一个变址寄存器之和给出 。
可用的基址寄存器为 BX,BP
变址寄存器为 SI,DI
如 MOV AL,[ BX+SI ]
MOV AX,[ BX][DI ]
MOV DL,[ BP+SI ]
MOV DX,[ BP][DI ]
默认段寄存器由基址寄存器决定 。
① 基址寄存器为 BX,默认段寄存器为 DS
(SI)
PA = ( DS )× 10H + ( BX ) +
(DI)
② 基址寄存器为 BP,默认段寄存器为 SS
(SI)
PA = ( SS )× 10H + ( BP ) +
(DI)
使用 BX的基址加变址寻址,默认段寄存器为 DS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存使用 BP的基址加变址寻址,默认段寄存器为 SS
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CPU 总线 内存例,MOV AX,[ BX + SI ]
若 ( DS ) = 4000H
( BX ) = 2000H
( SI ) = 100H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( BX ) + ( SI )
= 42100H
指令执行后
(AX) = (42100H) = 2345H
42100 45
0 0
8B指 令
23
7,相对基址加变址寻址
操作数的有效地址由基址寄存器,变址寄存器,偏移量三者之和给出 。
可用的寄存器与基址加变址寻址方式相同基址寄存器有 BX,BP
变址寄存器有 SI,DI
如 MOV AL,[ BX+SI +10H]
MOV AX,20H[ BX][DI ]
MOV DL,[ BP+SI+30H ]
MOV DX,40H[ BP][DI ]
默认段寄存器由基址寄存器决定,与基址加变址寻址相同
① 基址寄存器为 BX,默认段寄存器为 DS
(SI)
PA = ( DS )× 10H + ( BX ) + + 偏移量
(DI)
② 基址寄存器为 BP,默认段寄存器为 SS
(SI)
PA = ( SS )× 10H + ( BP ) + + 偏移量
(DI)
例,MOV AX,[ BX + SI + 10H ]
若 ( DS ) = 4000H
( BX ) = 3000H
( SI ) = 200H
则内存操作数的物理地址为:
PA = ( DS )× 10H + ( BX ) + ( SI ) + 10H
= 43210H
指令执行后
(AX) = (43210H) = 8877H
43210 77
10
40指 令
88
8B
实验:利用 DEBUG学习寻址方式在 DEBUG下汇编下列指令,并查看每条指令执行后的结果,
MOV BX,2000h
MOV [BX],CS
思考,如何查看指令 MOV [BX],CS 执行后的结果?
用 R命令可以吗?
操作数 [BX]在哪里?
它的内存地址如何构成?
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
126C:0100 MOV BX,2000?
126C:0103 MOV [BX],CS?
126C:0105?
-R? ;查看指令执行前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0100 NV UP EI PL NZ NA PO NC
126C:0100 B83412 MOV AX,1234
-D DS:2000 L20? ;查看指令执行前内存单元的内容
126C:2000 00 44 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4,D.!..4....t3.3.
126C:2010 24 0C 75 09 A0 51 DC 0A-06 4D DC 74 19 7A 21 A8 $.u..Q...M.t.z!.
-T=100? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0103 NV UP EI PL NZ NA PO NC
126C:0103 8C0F MOV [BX],CS DS:2000=4400
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0105 NV UP EI PL NZ NA PO NC
126C:0105 0475 ADD AL,75
-D DS:2000 L10? ;查看指令执行后内存单元的内容
126C:2000 6C 12 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4 l..!..4....t3.3.
-Q?
寻址方式的几点说明
1,偏移量可用符号地址给出例,MOV AX,mask [ BX ]
若 ( DS) = 1000H
( BX) = 300H
OFFSET mask = 2000H
PA = ( DS ) × 10H + ( BX )
+ OFFSET mask
= 12300H
执行后 ( AX ) = 6B5A H
1230 0 5A
33
22
mask
12000
6B
11
2,段跨越前缀的使用
段跨越前缀在指令中出现的指定内存单元段地址的段寄存器符号。
表示方法为 段寄存器名,
例,MOV AX,ES,[ BX ]
ES,MOV AX,[ BX ] ( DEBUG下格式 )
为减小指令长度,CPU采用默认关系获取段地址。
使用段跨越前缀可强行改变这种默认关系。
使用段跨越前缀的指令比不使用的指令要多占一个字节 。
8B
07
指 令 M O V AX,ES,[B X]
26
指 令 M O V A X,[B X ]
8B
07
使用段跨越前缀的物理地址计算例,MOV AX,ES,[ BX ]
使用段跨越的前缀后,段地址由指定的段寄存器给出,
不再遵循默认关系。
PA =( ES) × 10H + ( BX)
而不等于 ≠ ( DS) × 10H + ( BX)
只有存储器操作数需用段跨越的前缀
ES,MOV [SI],CX
DS,MOV AL,[BP]
MOV ES,AX,0
CS,MOV CX,22H
3,不自创寻址方式内存操作数地址只能由 BX,BP,SI,DI给出,
它们的组合也不是任意的 。
基址加变址
[ BX +SI ]
[ BX +DI]
[ BP +SI ]
[ BP +DI]
寄存器相对
[SI + X ]
[DI + X ]
[BX + X ]
[BP + X ]
寄存器间接
[SI ]
[DI ]
[BX ]
[BP ]
相对基址加变址
[ BX +SI+ X ]
[ BX +DI+ X]
[ BP +SI+ X ]
[ BP +DI+ X]
X 为 8 位或 16 位偏移量除此之外,其他方式均错误 。
如 MOV CL,[AX]
MOV AX,[DX]
MOV AL,[CX]
MOV CX,[BP+BX]
MOV AH,[SI+DI]
MOV BL,[AX+CX]
D:\>DEBUG?
-A?
0AFA:0100 MOV CL,[AX]?
^ Error
0AFA:0100 MOV AX,[DX]?
^ Error
0AFA:0100 MOV AL,[CX]?
^ Error
0AFA:0100 MOV CX,[BP+BX]?
^ Error
0AFA:0100 MOV AH,[SI+DI]?
^ Error
0AFA:0100 MOV BL,[AX+CX]?
^ Error
0AFA:0100?
-
利用 DEBUG可判断下列寻址方式错:
第三节 8086/8088的指令系统一,概述二,数据传送指令三,算术运算指令四,逻辑运算指令五,控制转移指令六,处理机控制指令七,串操作指令一.概述
1,指令助记符表
2,学习指令的要点
3,利用 DEBUG程序,学习指令系统
4,指令中操作数的表示
5,书写指令注意事项指令类型 助记符通用传送 M OV,P USH,P OP,XC HG,XL A T
地址传送 LEA,L DS,L ES
标志传送 PU SH F,PO PF,LA HF,SAH F
数据传送 输入输出 IN,O UT
加法 ADD,ADC,INC,AAA,DA A
减法 SUB,SBB,DE C,N EG,CM P,AA S,DA S
乘法 M UL,IM UL,AAM
除法 DIV,IDI V,A AD
算术运算符号扩展 CBW,CW D
逻辑运算 AND,TE ST,O R,XO R,N OT
移位 SH L,SAL,SH R,SA R
逻辑操作循环移位 RO L,RO R,R CL,R CR
1,指令助记符表指令类型 助记符串操作 MO VS,CM PS,SCAS,L ODS,ST OS串处理 重复控制 REP,REP E/ REP Z,RE PNE /RE PNZ
无条件转移 JM P
条件转移
JE /JZ,JNE /JNZ,JS,J NS,JO,JNO
JP,JNP,JC,J NC,JCXZ
JA / JNBE,JAE/ JNB,JB /JNAE,JB E/ JNA
JG /JNL E,J GE /JNL,J L/ JNG E,J LE/J NG
循环控制 LO OP,LOO PE /LO OPZ,LOO PNE /LO OPNZ
过程调用 CALL,RET
控制转移中断指令 INT,INT O,IRET
处理机控制
CLC,S TC,CM C,CLD,S T D,CLI,S T I
NOP,H L T,W AIT,ES C,LO CK
2,学习指令的要点从以下几个方面来掌握一条指令,
指令的助记符
指令的格式,操作数的个数、类型
执行的操作,指令执行后的结果包括,哪些寄存器、内存单元的值发生了变化对标志位有无影响,哪些受影响
特点及注意事项只介绍常用的指令,其他需要时可自学 。
3,利用 DEBUG学习寻址方式、指令系统(示例)
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
126C:0100 MOV BX,2000
126C:0103 MOV [BX],CS
126C:0105
-R? ;查看指令执行前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0100 NV UP EI PL NZ NA PO NC
126C:0100 B83412 MOV AX,1234
-D DS:2000 L20? ;查看指令执行前内存单元的内容
126C:2000 00 44 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4,D.!..4....t3.3.
126C:2010 24 0C 75 09 A0 51 DC 0A-06 4D DC 74 19 7A 21 A8 $.u..Q...M.t.z!.
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0103 NV UP EI PL NZ NA PO NC
126C:0103 8C0F MOV [BX],CS DS:2000=4400
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0105 NV UP EI PL NZ NA PO NC
126C:0105 0475 ADD AL,75
-D DS:2000 L10? ;查看指令执行后内存单元的内容
126C:2000 6C 12 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4 l..!..4....t3.3.
-Q?
4,指令中操作数的表示符号 表示内容
dat a 立即数操作数
r eg
通用寄存器操作数
8 位,AH,AL,BH,BL,CH,CL,DH,DL
16 位,AX,BX,CX,DX,BP,SP,SI,DI
seg r eg 段寄存器 CS,DS,SS,ES
mem
或 [ ]
存储器操作数 ( 5 种寻址方式)
sr c 源操作数
dst 目的操作数
( ) 寄存器、存储器、端口的内容
oprd1
oprd2
两操作数
5,书写指令注意事项:
不区分字母的大小写 。
下列写法表示同一条指令:
MOV AX,1ABDH
mov ax,1abdh
不添加指令系统没有的指令,即不自创助记符 。
将 MOV AL,0 写成 MOVE AL,0
JMP lable 写成 JUMP lable
注意操作数的范围对字节操作指令 0 ~ FFH 0 ~ 255
对字操作指令 0 ~ FFFFH 0 ~ 65535
MOV AL,260
MOV AX,70000
MOV AL,1FFH
MOV AL,2ABCDH
对无操作数指令,不添加操作数 。
STC AL
对单操作数指令,操作数不能是立即数 。
IMUL 6
对双操作数指令
① 不能两个同为存储器操作数
MOV [ DI ],[ SI ]
② 目的操作数不能是立即数
ADD 3,AL
③ 两个操作数的类型应相同
SUB AX,BL
若 value 定义为字类型存储器变量:
MOV CL,value [ BX ]
内存操作数的属性应明确 。
MOV [ BX ],0
MOV byte ptr [ BX ],0
MOV word ptr [ BX ],0
MOV [ BX ],AL
MOV [ BX ],AX
A,B,C,D,E,F开头的十六进制数前面加 0,
与 H结尾的标识符区别 。
如 寄存器名 AH,BH,CH,DH
变量名 abcdH 等例 mov AL,0AH
mov AL,AH
mov BX,0abcdH
CS 和 IP的值只在 控制转移指令 中修改。
对非控制转移指令,取完指令后 IP值自动 指向下条指令。
段寄存器 CS的值,只在 MOV,PUSH中可作操作数,
且这两条指令执行结果不改变 CS值。
MOV AX,CS
PUSH CS
IP,PSW两个寄存器不作为操作数在指令中出现。
mov IP,1234H
mov PSW,0F0FH
PSW状态寄存器的值由指令执行后确定,
不同的指令对各标志的影响不同。