第四章第3节1(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指令序列执行后, 指令序列执行后, (AL)=41H。 。 图4.12 16#数的 数的ASCII码表 码表
…
内存的数据段有一张16 例:内存的数据段有一张 #数符的
Leabharlann Baidu
存存存
3) src—table 是表首单元的符号地址,可以省略不写。 是表首单元的符号地址 可以省略不写。 首单元的符号地址, 4)表所在的段隐含为数据段,允许段超越。 )表所在的段隐含为数据段,允许段超越。 XLAT指令的几种表示形式如下: 指令的几种表示形式如下: 指令的几种表示形式如下 XLAT XLAT src_table XLATB XLAT ES:src_table : ;不写操作数 ;写操作数 表示字节类型, ;B表示字节类型,不允许再写操作数 表示字节类型 ;发生段超越时必须写操作数
√
;此指令正确否? 此指令正确否?
三、 目标地址传送指令 8086/8088 提供了三条把地址指针送入寄存器或寄存器对的指 可用来写入近地址指针和远地址指针。 令,可用来写入近地址指针和远地址指针。 1 .取有效地址指令 取有效地址指令LEA (Load Effective Address) 取有效地址指令 (近地址传送指令 近地址传送指令) 近地址传送指令 指令格 指令格 式 完成的操作 LEA reg16,mem16 ;将指定单元的偏移地址 目标寄存器 将指定单元的偏移地址→目标寄存器 将指定单元的偏移地址 说明: 此指令的目的操作数必须是 位通用寄存器, 目的操作数必须是16位通用寄存器 说明:1)此指令的目的操作数必须是 位通用寄存器,源操作 数必须是存储器操作数。 数必须是存储器操作数。 2) mem16 可采用任何一种存储器操作数寻址方式。
MOV BX,OFFSET Hex_table ;(BX)←表首址 , 表首址 MOV AL,0AH , XLAT Hex_table ;(AL)←序号 序号 ;查表转换
Hex_table+9 39H('9') Hex_table+10 41H('A') Hex_table+11 42H('B') … Hex_table+15 46H('F') …
定 义 的 堆 栈
堆 栈 段
(SP)初 )
2E00H
92E00H
FFFFH
9FFFFH
堆栈操作指令是用来将数据压入和弹出堆栈的 堆栈操作指令是用来将数据压入和弹出堆栈的。 是用来将数据压入和弹出堆栈
压栈指令PUSH (PUSH word onto stack) ① 压栈指令 指令格式 完成操作的过程 PUSH src ;(SP)←(SP)−2,( (SP)+1:(SP) )←(src) , :
② 出栈指令 出栈指令POP (POP word off stack) POP 说明: 说明: 1.堆栈指令的操作是以字为单位的, 操作数必须是 位的。 堆栈指令的操作是以字为单位的 操作数必须是16位的 位的。 堆栈指令的操作是以字为单位的 2.操作数可为 、mem和segreg,但不可为 操作数可为reg、 操作数可为 和 ,但不可为data。 。 3. POP指令的操作数不可为 。 指令的操作数不可为 指令的操作数不可为CS。 dst ;(dst) ←( (SP)+1,(SP)) , , (SP)←(SP) +2
LEA AX,[BP][DI] ,
;(AX)←(BP)+(DI)
LEA DX,BETA[BX][SI] ;(DX)←(BX)+(SI)+BETA , 注意LEA指令与 指令与MOV指令的区别! 指令的区别! 注意 指令与 指令的区别 LEA BX,BUF , 的偏移地址送到BX ;将存储器变量BUF的偏移地址送到 将存储器变量 的偏移地址送到 ;将BUF单元中的内容送 单元中的内容送BX 单元中的内容送 MOV BX,BUF ,
以下两条指令的效果相同: 以下两条指令的效果相同 LEA CX, TAB , MOV CX,OFFSET TAB , 例: LEA CX,100[DI] ,
执行后: 执行后: (CX)=(DI)+100 ) ( )
2. 远地址传送指令 1) 地址指针装入 地址指针装入DS 、reg16指令 指令LDS (Load pointer into DS) 指令格式 完成的操作 LDS reg16 , mem32 ;将双字单元 将双字单元mem32中的 位地址指针 中的32位地址指针 位地址指针→DS、 reg16 说明:mem32单元的低字送目标寄存器 16,高字送 单元的低字送目标寄存器 低字送目标寄存器reg 高字送DS 说明 例: LDS SI,[0010H] , 设当前(DS)=C000H,有关存储单元的内容为(C0010H)=80H, ,有关存储单元的内容为 设当前 , (C0011H)=01H,(C0012H)=00H,(C0013H)=20H, , , , 解:求出该双字单元的地址: (DS)x 10H+ 0010H=C0010H 求出该双字单元的地址: ) 该双字单元的低字: 该双字单元的低字: ( C0010H)=0180H→ SI ) 高字: 高字: ( C0012H)=2000H→DS ) 即则执行指令LDS SI,[0010H]后 即则执行指令 , 后 (SI)=0180H (DS)=2000H
2. 输出指令 格式 格式1
格式2 格式
OUT port,acc ; ,
说明: 说明: 1) port是用 位2#常数表示的 端口地址。 ) 是用8位 常数表示的I/O端口地址 端口地址。 是用
指令以外的其它指令访问外设端口。 2)不可用IN、OUT指令以外的其它指令访问外设端口。 )不可用 、 指令以外的其它指令访问外设端口 3)CPU只能用累加器 ) 只能用累加器AL/AX与外设端口交换数据。 与外设端口交换数据。 只能用累加器 与外设端口交换数据 4)当口地址超过8位2#数范围时,必须将其放入 中,采 )当口地址超过 位 数范围时 必须将其放入DX中 数范围时, 用格式2的指令形式访问 的指令形式访问。 用格式 的指令形式访问。 的端口中的数据读入到AL 例:IN AL,60H; 将地址为 , ; 将地址为60H的端口中的数据读入到 的端口中的数据读入到 OR AL,80H;将原端口中数据的最高位置“1” , ;将原端口中数据的最高位置“ OUT 60H,AL;将修改后的数据写回 , ;将修改后的数据写回60H端口 端口 IN AX, 60H ,
一、 通用数据传送指令
1.基本传送指令MOV 基本传送指令 指令格式 MOV dst,src , 完成的操作 ; (dst)←(src) ) ( )
说明:1)指令中至少要有一个操作数能明确类型 )指令中至少要有一个操作数能明确类型
•可进行的传送有: 可进行的传送有:
•通用寄存器 通用寄存器 通用寄存器 通用寄存器 存储器 •通用寄存器、存储器 通用寄存器、 通用寄存器 •段寄存器(除CS外) 段寄存器( 段寄存器 外 •通用寄存器 、存储器 通用寄存器 立即数 通用寄存器、 通用寄存器、存储器 段寄存器
4.3.1数据传送指令 数据传送指令
数据传送指令是程序中使用最频繁的指令。 数据传送指令是程序中使用最频繁的指令 。 各种信息在 CPU的寄存器与存储器或 端口之间的传送,都是由这类指 的寄存器与存储器或I/O端口之间的传送 的寄存器与存储器或 端口之间的传送, 令完成。 令完成。 数据传送指令按其功能的不同,可以分为: 数据传送指令按其功能的不同,可以分为: 通用数据传送指令 输入输出指令 目标地址传送指令 标志传送指令
寄存器寻址 寄存器相对寻址 基址变址相对寻址 寄存器寻址
2. 堆栈操作指令
堆栈:设在堆栈段内的一段遵循“后进先出” 堆栈 设在堆栈段内的一段遵循“后进先出” 规则的存储区域 设在堆栈段内的一段遵循 则堆栈段首单元地址为90000H,最后一个单元地 设SS=9000H,则堆栈段首单元地址为 则堆栈段首单元地址为 , 址为9FFFFH。若SP初值设定为2E00H,则初始栈顶(所定 初值设定 址为 。 初值设定为 ,则初始栈顶( 义栈的栈底 单元地址为92E00H,该堆栈的大小为 栈底) 义栈的栈底)单元地址为 ,该堆栈的大小为2E00H 个字节。 个字节。 PA EA 90000H 0000H
基本传送指令举例
例:
MOV WORD PTR[1300H],9;
MOV AX , MEM ; MOV AL,[BX]; , ; MOV DS,AX; , ; MOV DISP[SI],CX; , ; MOV AX,[DISP+BX]; , ; MOV DISP[DI][BP],AX; , ;
源操作数寻址 目标操作数寻址 直接寻址 立即寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器寻址 寄存器寻址 寄存器寻址 寄存器相对寻址
例:PUSH AX; ; POP PUSH BX; ; DS ;
PUSH POP POP
DATA[SI]; ; DATA[DI]; ; ES; ;
3. 数据交换指令 数据交换指令XCHG (eXCHanGe) 指令格式 完成的操作 XCHG dst,src , ;(dst)←→(src) 说明: 说明: 不可为data 、segreg 1) 操作数不可为 操作数不可为 2) 可以是寄存器之间、寄存器与存储器之间交换 可以是寄存器之间、 3)段寄存器不能参加交换 ) 4)不允许在两个内存单元之间进行交换。 )不允许在两个内存单元之间进行交换。 进行交换
ASCII码表,其首地址为Hex_table, 码表,其首地址为 码表 , 为了查10号元素 号元素, 为了查 号元素,即16#数A的ASCII 的 可用以下几条指令实现: 码,可用以下几条指令实现:
Hex_table+0 Hex_table+1 Hex_table+2
30H('0') 31H('1') 32H('2') …
不可用一条MOV指令进行以下传送: 指令进行以下传送: 不可用一条 指令进行以下传送
存储器 段寄存器 CS、IP 、 存储器 段寄存器 段寄存器 立即数 立即数、存储器、 立即数、存储器、寄存器
注意:不允许用户利用传送指令改变 、 中的内容 中的内容。 注意:不允许用户利用传送指令改变CS、 IP中的内容。但 可以作为源操作数。 是CS可以作为源操作数。 可以作为源操作数
二、 输入输出指令 输入输出指令是cpu与外设端口之间进行数据交换的专用 输入输出指令是 与外设端口之间进行数据交换的专用 指令。共有两条: 指令。共有两条:IN 、 OUT 指令格 式 1. 输入指令 格式 格式1
格式2 格式
完成的操作 IN acc,port , IN acc,DX , OUT DX,acc , ; (acc) ← (port) (port) ← (acc) ;端口地址超过 位时使用 端口地址超过8位时使用 ;端口地址超过 位时使用 端口地址超过8位时使用
例:XCHG AX,BX , XCHG AL,BL , XCHG DATA[SI],CX ,
错误的例子: 错误的例子: XCHG DATA[SI], [BX] , XCHG AL,100 , XCHG AX, DS ,
4. 查表转换指令 查表转换指令XLAT (transLATe) 指令格式 完成的操作 XLAT src_table ;(AL)←[(BX)+(AL)] 指令, XLAT是字节查表转换指令,可以根据表中元素的序号,查 是字节查表转换指令 可以根据表中元素的序号, 出表中相应元素的内容。元素的序号从0开始顺序编排 出表中相应元素的内容。元素的序号从 开始顺序编排。 序号从 开始顺序编排。 说明: 说明: 1)使用该指令时,须预先将表首单元的偏移地址存入BX、待 使用该指令时,须预先将表首单元的偏移地址存入 、 使用该指令时 查元素的序号送入AL,指令执行后,所查元素放在了 中 查元素的序号送入 ,指令执行后,所查元素放在了AL中。 2)由于元素序号是放在AL的,故表的最大长度为 )由于元素序号是放在 的 故表的最大长度为256个字节。 个字节。 个字节