第四章80x86的寻址方式和指令系统3
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将指令指定mem32单元的前两个单元内容(16位偏移量)装入指 定通用寄存器,把后两个单元内容(段地址) 装入到DS段寄存 器。
用于写远地址指针。
例: 假设: (DS)=C 000H
指令: LDS SI, [0010H]
执行指令后: (SI)=0180H (DS)=2000H
(DS) C000H:0010H
(三)目的地址传送指令(Address-object transfer) 8086 /8088 提供三条: 地址指针写入指定寄存器或寄存器对指令。
1、LEA(Load Effective Address) 2、LDS (Load pointer using DS) 3、LES (Load pointer using ES)
必须通过累加器AX(字)或AL(节)输出数据。
例1:实现(29H)(28H)→(DATA_WORD) IN AX,28H MOV DATA_WORD,AX
例2:从端口3FCH 送一个字到AX寄存器 MOV DX,3FCH IN AX,DX ; (AL)←(3FCH), (AH)←(3FDH)
例3:实现将(AL) →(05H) OUT 5,AL;(05H)←(AL)
str_table——表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。
XLAT指令使用方法:
• 先建立一个字节表格; • 表格首偏移地址存入BX; • 需要转换代码的序号(相对与表格首地址位移量)存入AL; (表中第一个元素的序号为0) • 执行XLAT指令后,表中指定序号的元素存于AL中。
执行指令后: EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH
(BX)=139EH
注意:设 (DS)=3000H
BUFFER=1000H (31000H)=0040H
(DS) BUFFER 3000H:1000H
31001H
存储器 ... 40H 00H ...
将指令指定mem32单元的前两个单元内容(16位偏移量)装入 指定通用寄存器,把后两个单元内容(段地址) 装入到ES段 寄存器。 用于写远地址指针。
例: 假设: (DS)=B 000H
(BX)=080AH
指令: LES DI, [BX]
执行指令后: (DI)=05A2H (ES)=4000H
(DS) (BX) B000H:080AH
(AL)为转换的代码。
XLAT指令应用:
若把字符的扫描码转换成ASCII码; 或数字0~9转换成7段数码所需要的相应代码(字形码)等 就要用XLAT指令。
例:内存的数据段中有一张十六进制数字的ASCII码表。 首地址为:Hex_table ,欲查出表中第10个元素(‘A’)
执行指令序列:
MOV BX,OFFSET Hex_table MOV AL,0AH XLAT
应用举例:
XCHG BL,DL XCHG AX,SI XCHG COUNT[DI], AX
XCHG [BX],[DI] XCHG DS, AX
(错) (错)
4. XLAT(Trans late)换码指令:该指令不影响标志位。
格式: XLAT str_table ;(AL)←((BX )+(AL)) 或 XLAT
3、交换指令(Exchange)
格式:XCHG dest , src
;(dest) (src)
执行操作:
把一个字节或一个字的源操作数与目的操作数相交换。
可以 实现: 寄存器之间
寄存器和存储器之间
注意:
• 存储器之间不能交换,两个操作数中必须有一个在寄存器中;
• 段寄存器不能作为一个操作数;
• 允许字或字节操作,不影响标志位。
B080BH B080CH B080DH
存储器 ... A2H 05H 00H 40H ...
存储器
(DS) TABLE
...
设:
5000H:1000H源自40H(DS)=5000H
51001H 00H
TABLE=1000H
51002H 00H
分析下列指令执行结果:
51003H 30H ...
MOV BX,TABLE
(3)请思考下列指令的正、误
LEA DX ,BETA[BX][SI] LEA DX , AX
2、LDS (Load pointer using DS)
格式:LDS reg16, mem32
;(reg16)←(EA) (DS)←((EA)+2))
功能:将指令指定32位地址指针送指令指定寄存器和DS。
(1) LEA 指令与MOV 的区别 LEA BX , BUFFER ;(BX)=1000H MOV BX , BUFFER ; (BX)=0040H
LEA 指令与MOV等价
LEA BX , BUFFER
; (BX)=1000H
MOV BX , OFFSET BUFFER ; (BX)=1000H
(2)LEA 指令中的目标寄存器必须是16位的通用寄存器, 源操作数必须是一个存储器。
;(BX)=0040H
MOV BX,OFFSET TABLE ;(BX)=1000H
LEA BX,TABLE ;(BX)=1000H
LES BX,TABLE ;(BX)=0040H,(ES)=3000H
LDS BX,TABLE ;(BX)=0040H,(DS)=3000H
间接寻址: 当端口号≥256时,只能使用间接寻址, 必须先把端口号放到DX寄存器中。 不需要用任何段寄存器来修改它的值。
1、IN (Input byte or word) 输入指令
格式:IN acc, port ;(acc) (port)
具体形式有四种: IN AL, data8 IN AX, data8 IN AL, DX IN AX, DX
1、LEA(Load Effective Address)
格式: LEA reg16 , mem16 ;EA(reg16) 功能:加载有效地址,用于写近地址指针。 把指令中指定的存储器操作数有效地址装入指定的寄存器 。
例:设(BX)=0400H,(SI)=003CH LEA BX,[BX+SI+0F62H]
C0011H C0012H C0013H
存储器 ... 80H 01H 00H 20H ...
3、LES (Load pointer using ES)
格式:LES reg16, mem32 ;(reg16)←(EA) (ES)←((EA)+2))
功能:把源操作数指定的4个相继字节送指令指定的寄存器 及ES寄存器中。 此指令常常指定DI寄存器。
46H
'F'
...
(AL)=41H=(F004AH),
16进制数的ASCII码表
即“A”的ASCII码。
(二)输入输出指令(Input and Output)
输入输出指令共两条: 1、IN (Input byte or word) 2 、OUT (Output byte or word)
输入指令用于CPU从外设端口接受数据, 输出指令用于CPU向外设端口发送数据。
端口数:外部设备最多有65536个I/O端口。 A0~A15译码形成。
端口号:端口号(即外设端口地址)为0000H~FFFFH。 PC机仅使用A0~A9译码形成I/O口地址,即1024H个口地址
端口号:0000H~03FFH 其中: A9=1,表示扩充槽上的口地址。
直接寻址: 端口号中前256个端口(0~FFH),可以直接写在指令中, 这就是直接寻址。 端口号代替指令中的PORT, 机器指令用二字节表示,第二字节就是端口号。
无论接受还是发送数据,必须通过累加器AX(字)或AL(字节), 又称累加器专用传送指令 。
输入、输出指令不影响标志位。
每个外设要占几个端口:数据口,状态口和控制口。
DB
CPU
AB
译 码
CB
数据端口 状态端口 控制端口 I/O接口
I/O 设备
信息交换要通过端口,
在IBMPC机里,可以配接许多外部设备, 每个外设与CPU之间交换数据,状态信息和控制命令, 每一种信息交换都要通过一个端口来进行。
; 端口地址8位,输入一个字节 ;端口地址8位,输入一个字 ;端口地址16位,输入一个字节 ;端口地址16位,输入一个字
必须通过累加器AX(字)或AL(节)输入数据。
2 、OUT(Output byte or word) 输出指令
格式: OUT port, acc
;(port) (acc)
具体形式有四种: OUT data8 , AL ; 端口地址8位,输出一个字节 OUT data8, AX ;端口地址8位,输出一个字 OUT DX , AL ;端口地址16位,输出一个字节 OUT DX , AX ;端口地址16位,输出一个字
Hex_table
Hex_table+1 Hex_table+2
假设:
30H
'0'
31H
'1'
32H
'2'
...
39H
'9'
(DS)=F000H,
Hex_table+0AH
41H
'A'
Hex_table=0040H (AL)=0AH 执行XLAT以后:
Hex_table+0BH
42H
'B'
...
Hex_table+0FH
用于写远地址指针。
例: 假设: (DS)=C 000H
指令: LDS SI, [0010H]
执行指令后: (SI)=0180H (DS)=2000H
(DS) C000H:0010H
(三)目的地址传送指令(Address-object transfer) 8086 /8088 提供三条: 地址指针写入指定寄存器或寄存器对指令。
1、LEA(Load Effective Address) 2、LDS (Load pointer using DS) 3、LES (Load pointer using ES)
必须通过累加器AX(字)或AL(节)输出数据。
例1:实现(29H)(28H)→(DATA_WORD) IN AX,28H MOV DATA_WORD,AX
例2:从端口3FCH 送一个字到AX寄存器 MOV DX,3FCH IN AX,DX ; (AL)←(3FCH), (AH)←(3FDH)
例3:实现将(AL) →(05H) OUT 5,AL;(05H)←(AL)
str_table——表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。
XLAT指令使用方法:
• 先建立一个字节表格; • 表格首偏移地址存入BX; • 需要转换代码的序号(相对与表格首地址位移量)存入AL; (表中第一个元素的序号为0) • 执行XLAT指令后,表中指定序号的元素存于AL中。
执行指令后: EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH
(BX)=139EH
注意:设 (DS)=3000H
BUFFER=1000H (31000H)=0040H
(DS) BUFFER 3000H:1000H
31001H
存储器 ... 40H 00H ...
将指令指定mem32单元的前两个单元内容(16位偏移量)装入 指定通用寄存器,把后两个单元内容(段地址) 装入到ES段 寄存器。 用于写远地址指针。
例: 假设: (DS)=B 000H
(BX)=080AH
指令: LES DI, [BX]
执行指令后: (DI)=05A2H (ES)=4000H
(DS) (BX) B000H:080AH
(AL)为转换的代码。
XLAT指令应用:
若把字符的扫描码转换成ASCII码; 或数字0~9转换成7段数码所需要的相应代码(字形码)等 就要用XLAT指令。
例:内存的数据段中有一张十六进制数字的ASCII码表。 首地址为:Hex_table ,欲查出表中第10个元素(‘A’)
执行指令序列:
MOV BX,OFFSET Hex_table MOV AL,0AH XLAT
应用举例:
XCHG BL,DL XCHG AX,SI XCHG COUNT[DI], AX
XCHG [BX],[DI] XCHG DS, AX
(错) (错)
4. XLAT(Trans late)换码指令:该指令不影响标志位。
格式: XLAT str_table ;(AL)←((BX )+(AL)) 或 XLAT
3、交换指令(Exchange)
格式:XCHG dest , src
;(dest) (src)
执行操作:
把一个字节或一个字的源操作数与目的操作数相交换。
可以 实现: 寄存器之间
寄存器和存储器之间
注意:
• 存储器之间不能交换,两个操作数中必须有一个在寄存器中;
• 段寄存器不能作为一个操作数;
• 允许字或字节操作,不影响标志位。
B080BH B080CH B080DH
存储器 ... A2H 05H 00H 40H ...
存储器
(DS) TABLE
...
设:
5000H:1000H源自40H(DS)=5000H
51001H 00H
TABLE=1000H
51002H 00H
分析下列指令执行结果:
51003H 30H ...
MOV BX,TABLE
(3)请思考下列指令的正、误
LEA DX ,BETA[BX][SI] LEA DX , AX
2、LDS (Load pointer using DS)
格式:LDS reg16, mem32
;(reg16)←(EA) (DS)←((EA)+2))
功能:将指令指定32位地址指针送指令指定寄存器和DS。
(1) LEA 指令与MOV 的区别 LEA BX , BUFFER ;(BX)=1000H MOV BX , BUFFER ; (BX)=0040H
LEA 指令与MOV等价
LEA BX , BUFFER
; (BX)=1000H
MOV BX , OFFSET BUFFER ; (BX)=1000H
(2)LEA 指令中的目标寄存器必须是16位的通用寄存器, 源操作数必须是一个存储器。
;(BX)=0040H
MOV BX,OFFSET TABLE ;(BX)=1000H
LEA BX,TABLE ;(BX)=1000H
LES BX,TABLE ;(BX)=0040H,(ES)=3000H
LDS BX,TABLE ;(BX)=0040H,(DS)=3000H
间接寻址: 当端口号≥256时,只能使用间接寻址, 必须先把端口号放到DX寄存器中。 不需要用任何段寄存器来修改它的值。
1、IN (Input byte or word) 输入指令
格式:IN acc, port ;(acc) (port)
具体形式有四种: IN AL, data8 IN AX, data8 IN AL, DX IN AX, DX
1、LEA(Load Effective Address)
格式: LEA reg16 , mem16 ;EA(reg16) 功能:加载有效地址,用于写近地址指针。 把指令中指定的存储器操作数有效地址装入指定的寄存器 。
例:设(BX)=0400H,(SI)=003CH LEA BX,[BX+SI+0F62H]
C0011H C0012H C0013H
存储器 ... 80H 01H 00H 20H ...
3、LES (Load pointer using ES)
格式:LES reg16, mem32 ;(reg16)←(EA) (ES)←((EA)+2))
功能:把源操作数指定的4个相继字节送指令指定的寄存器 及ES寄存器中。 此指令常常指定DI寄存器。
46H
'F'
...
(AL)=41H=(F004AH),
16进制数的ASCII码表
即“A”的ASCII码。
(二)输入输出指令(Input and Output)
输入输出指令共两条: 1、IN (Input byte or word) 2 、OUT (Output byte or word)
输入指令用于CPU从外设端口接受数据, 输出指令用于CPU向外设端口发送数据。
端口数:外部设备最多有65536个I/O端口。 A0~A15译码形成。
端口号:端口号(即外设端口地址)为0000H~FFFFH。 PC机仅使用A0~A9译码形成I/O口地址,即1024H个口地址
端口号:0000H~03FFH 其中: A9=1,表示扩充槽上的口地址。
直接寻址: 端口号中前256个端口(0~FFH),可以直接写在指令中, 这就是直接寻址。 端口号代替指令中的PORT, 机器指令用二字节表示,第二字节就是端口号。
无论接受还是发送数据,必须通过累加器AX(字)或AL(字节), 又称累加器专用传送指令 。
输入、输出指令不影响标志位。
每个外设要占几个端口:数据口,状态口和控制口。
DB
CPU
AB
译 码
CB
数据端口 状态端口 控制端口 I/O接口
I/O 设备
信息交换要通过端口,
在IBMPC机里,可以配接许多外部设备, 每个外设与CPU之间交换数据,状态信息和控制命令, 每一种信息交换都要通过一个端口来进行。
; 端口地址8位,输入一个字节 ;端口地址8位,输入一个字 ;端口地址16位,输入一个字节 ;端口地址16位,输入一个字
必须通过累加器AX(字)或AL(节)输入数据。
2 、OUT(Output byte or word) 输出指令
格式: OUT port, acc
;(port) (acc)
具体形式有四种: OUT data8 , AL ; 端口地址8位,输出一个字节 OUT data8, AX ;端口地址8位,输出一个字 OUT DX , AL ;端口地址16位,输出一个字节 OUT DX , AX ;端口地址16位,输出一个字
Hex_table
Hex_table+1 Hex_table+2
假设:
30H
'0'
31H
'1'
32H
'2'
...
39H
'9'
(DS)=F000H,
Hex_table+0AH
41H
'A'
Hex_table=0040H (AL)=0AH 执行XLAT以后:
Hex_table+0BH
42H
'B'
...
Hex_table+0FH