- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BP间址默认段地址SS。
(3)凡是遇到给SS赋值指令,系统自动禁止外部中断, 执行本条指令和下条指令后,恢复对SS寄存器赋值前 的中断开放情况。
这样做为了允许程序员连续用两条指令分别对SS 和SP寄存器赋值,同时又防止堆栈空间变动过程出现 中断。
*在修改SS和SP的指令之间不要插入其他指令。
(4) 所有通用传送指令不影响标志位
9
注意:
(1)不能用一条MOV指令实现以下传送。 ①存储单元之间的传送 MOV MEM2 , MEM1 错。
MOV AX , MEM1 MOV MEM2 , AX ②立即数送段寄存器 例 : MOV DS,2000H
对。 错。
MOV AX, 2000 H MOV DS , AX
对。
10
③ 段寄存器之间的传送 MOV ES , DS ; 错
(AX)
11 22 ...
(AX)
11H 22H ...
(SP)-2 (SP)-1
(SP)
(SP)
堆
栈 (SP)+1
段 (SP)+2
22H
堆
11H
栈 段
...
...
PUSH AX前
PUSH AX后
18
使用数据时将其弹出: POP BX
BX
33H 44H ...
(SP) (SP)+1 (SP)+2
22H
堆栈指针
SP
指令指针
IP(或PC)
标志位
Flags
目的和源变址寄存器
DI, SI
段寄存器
CS, DS, ES, SS
通用寄存器
r
AL或AX(取决于操作数长度) acc
2
src , dest 源,目的操作数(下列寻址方式都可以用)
[BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n]
断点的地址, 子程序或中断返回时恢复断点。
15
注意:SP——堆栈指针,始终指向栈顶。 SP初值用MOV SP,i m来设定。
下边详细说明一下堆栈用途:
16
(2)
堆栈操作指令 (堆栈操作指令有两条):
入栈指令
格式:
PUSH src
; (SP) (SP)-2
把
一个字的源操作数压入堆栈顶部,同时修改堆栈
… ADD SP, 6
21
3、交换指令
格式:XCHG dest , src ;(dest) (src) 执行操作: 把一个字节或一个字的源操作数与目的 操作数相交换。
可以实现: 寄存器之间、寄存器和存储器之间 注意: • 存储器之间不能交换,两个操作数中必须有一个在 寄存器中; • 段寄存器不能作为一个操作数; • 允许字或字节操作,不影响标志位。
不需要用任何段寄存器来修改它的值。
31
1、IN 输入指令
格式:IN acc, port
具体形式有四种:
IN AL, data8 输入一个字节
IN AX, data8 输入一个字
IN AL, DX 输入一个字节
IN AX, DX 输入一个字
MOV BX,OFFSET Hex_table MOV AL,0AH XLAT Hex_table
Hex_table
Hex_table+1 Hex_table+2
30H
'0'
31H
'1'
32H
'2'
...
假设:
39H
'9'
(DS)=F000H, Hex_table=0040H (AL)=0AH 执行XLAT以后:
4
(一)通用传送指令
8086提供方便灵活的通用的传送操作,适用于大多数 操作数。
通用传送指令(除了XCHG以外)是唯一允许以段寄存 器为操作数的指令。
通用传送指令包括: 1、MOV 2、PUSH POP 3、XCHG 4、XLAT
5
1. MOV dest,src ;
(dest) (src)
目的 源
str_table——表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。
24
XLAT指令使用方法:
• 先建立一个字节表格; • 表格首偏移地址存入BX; • 需要转换代码的序号(相对与表格首地址位移量) 存入AL; (表中第一个元素的序号为0) • 执行XLAT指令后,表中指定序号的元素存于AL中。
[SI+n], [DI+n], [BP+n], [BX+n]
[N],
r
[] ES:[ ] OPRD Seg im
存储器单元的内容(正常在数据段) 附加存储器段的内容 操作数 段寄存器(CS,DS,ES,SS) 立即数 (n 8位, nn 16位, nnnn
32位 )
3
§4.2 数据传送指令
功能: 负责把数据、地址或立即数传送到寄存器或存 储单元。 特点: 它是计算机最基本、最重要的一种操作,使用 比例最高。 种类(分四种): (一)通用传送指令 (二)目标地址传送指令 (三)标志位传送指令 (四)输入输出指令
段寄存器之间不能传送。
例:MOV DL,CH ; 8位寄存器 8位寄存器
MOV AX,DX ; 16位寄存器 16位寄存器
MOV SI, BP
MOV DS,BX
;通用寄存器 段寄存器
MOV AX, CS ;段寄存器 通用寄存器
7
② 立即数传送至CPU内部通用寄存器组
③ 用于给寄存器(AX、BX、CX、DX、BP、SP、 SI、DI)赋初值。
13
• 堆栈在内存中的情况:
偏移地址
物理地址
可以用一条立即数传送指令给
00000H(低地址) ...
SP赋值,确定SP在SS段中的初 0000H
90000H
始位置。
例:设:(SS)=9000H , 堆栈段
为64KB
(SP)=E200H
MOV SP,0E200H;(SP)=0E200H
堆 9E200H 栈
Hex_table+0AH
41H
'A'
Hex_table+0BH
42H
'B'
...
Hex_table+0FH
46H
'F'
...
(AL)=41H=(F004AH),
16进制数的ASCII码表
即“A”的ASCII码。
27
(二)输入输出指令
输入输出指令共两条: 1、IN 2 、OUT 输入指令用于CPU从外设端口接受数据, 输出指令用于CPU向外设端口发送数据。
(除SAHF、POPF以外)。
12
2. PUSH POP
这是两条堆栈操作指令。 (1) 先介绍一下什么是堆栈,为什么需要堆栈 堆栈——按照先进后出原则组织的一段内存区域, 特点:① 下推式的(规定堆栈设置在堆栈段内) 改变SP的内容,
② 随着推入堆栈内容增加,SP的值减少。 ③先进后出工作原则(Last In First Out 简称LIFO)
存储器。
刺
③ 执行PUSH 指令, (SP)-2 (SP),
低字节放在低地址,高字节放在高地址。随着推
入堆栈内容增加,堆栈就扩展,SP的值减少,但SP
总是指向栈顶。
④ 堆栈工作原则后进先出。 PUSH ,POP指令应该
成对使用,保持堆栈原有状态。
⑤ 堆栈最大容量即为SP的初值与SS之间的差。 20
不能直接给段寄存器赋值
例: MOV CL,04H ;立即数8位寄存器
MOV AX,03FFH ;立即数16位寄存器
MOV WORD PTR [ SI] ,057BH ;立即数 存储器
MOV BYTE PTR MEM, 5 ;立即数存储器 思考:为什么加WORD PTR , BYTE PTR ? 不加对吗?
堆
11H
栈 段
BX 11H 22H
(SP)-2 (SP)-1 (SP)
...
POP BX前
...
22H
堆
11H
栈 段
...
POP BX后19源自应用时注意: ① 堆栈操作都按字操作。 ② PUSH , POP 指令的操作数可能有三种:
寄存器(通用寄存器,地址指针,变址寄存器),
段寄存器(CS除外,PUSH CS 合法,POP CS 非 法),
端口号:0000H~03FFH
其中: A9=1,表示扩充槽上的口地址。
30
长格式: 端口号中前256个端口(0~FFH),可以直接写在 指令中,这就是长格式。 端口号代替指令中的PORT, 机器指令用二字节表示,第二字节就是端口号。
短格式:
当端口号≥256时,只能使用短格式,
必须先把端口号放到DX寄存器中。
22
应用举例:
XCHG BL,DL XCHG AX,SI XCHG COUNT[DI], AX
XCHG [BX],[DI] XCHG DS, AX
(错) (错)
23
4. XLAT换码指令:
5. 该指令不影响标志位。 6. 格式:XLAT str_table;(AL)←((BX )+
(AL)) 或 XLAT
MOV AX , DS MOV ES , AX ; 对 。 注意CS和IP的使用
CS和IP不能作为目标操作数,CS可以作为源 操作数。 例: MOV CS,AX ; 错
MOV AX,CS ;对 。
MOV IP, AX
;错