380 likes | 671 Views
第四讲 8086/8088 的指令系统. 复习 7 种寻址方式 1. 立即数寻址 MOV AX,09A0H 2. 寄存器寻址 MOV AX,BX 3. 直接寻址 MOV AX,(09A0H) 4. 寄存器间接寻址 MOV AX,[BX] 5. 相对的寄存器间接寻址 MOV AX,[BX+55H] 6. 基址加变址寻址 MOV [BX+SI] , AX 7. 相对的基址加变址寻址 MOV 55H[BX+SI] , AX. 第一部分 指令系统概述 8086/8088 的指令系统中共有 92 种基本指令。
E N D
第四讲8086/8088的指令系统 复习7种寻址方式 1.立即数寻址 MOV AX,09A0H 2.寄存器寻址 MOV AX,BX 3.直接寻址 MOV AX,(09A0H) 4.寄存器间接寻址 MOV AX,[BX] 5.相对的寄存器间接寻址 MOV AX,[BX+55H] 6.基址加变址寻址 MOV [BX+SI] , AX 7.相对的基址加变址寻址 MOV 55H[BX+SI] , AX
第一部分 指令系统概述 8086/8088的指令系统中共有92种基本指令。 可以分成6个功能组: 1. 数据传送(Data transfer) 2. 算术运算(Arithmetic) 3. 逻辑运算和移位指令(Logic& Shift) 4. 串操作(String manipulation) 5. 控制转移(Control Transfer) 6. 处理器控制(Processor Control)
介绍指令系统使用的符号: 八位寄存器: AH,AL,BH,BH,BL,CH,CL,DH,DL 十六位通用寄存器: AX,BX,CX,DX,SP,BP,SI,DI 堆栈指针 SP 指令指针 IP(或PC) 标志位 Flags 目的和源变址寄存器 DI, SI 段寄存器 CS, DS, ES, SS
src , dest 源,目的操作数(下列寻址方式都可以用) [BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n] [SI+n], [DI+n], [BP+n], [BX+n] [N], r [ ] 存储器单元的内容(正常在数据段) ES:[ ] 附加存储器段的内容 OPRD 操作数 Seg 段寄存器(CS,DS,ES,SS) i m立即数 (n 8位, nn 16位, nnnn 32位 )
第二部分 8086/8088指令系统 一、 数据传送指令(Data transfer) (一)通用传送指令(General Purpose Transfer) (二)输入输出指令(Input and Output) (三)目的地址传送指令(Address-object transfer) (四)标志传送指令(Flag register transfer)
(一)通用传送指令(General Purpose Transfer) 8088提供方便灵活的通用的传送操作,适用于大多数操作数。 通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数指令。 通用传送指令包括: 1、MOV (Movement) 2、PUSH (Push word onto stack) POP (Pop word off stack) 3、XCHG (Exchange) 4、XLAT (Translate)
1. MOV dest, src ; (dest) (src) • 目的 源 目的 源 • 功能: • 把一个字节(B)或一个字(W)操作数由源传送至目的。 • 实现: 寄存器 寄存器/存储器之间; • 立即数寄存器/存储器 • 寄存器/存储器段寄存器之间的数据传送。
具体说,通用数据传送指令能实现: ① CPU内部寄存器之间的数据的任意传送 (除了码段寄存器CS和指令指针IP以外)。 段寄存器之间不能传送。 例: MOV DL,CH ; 8位寄存器 8位寄存器 MOV AX,DX ; 16位寄存器 16位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器 段寄存器 MOV AX, CS;段寄存器 通用寄存器
立即数传送至CPU内部通用寄存器组 • (AX、BX、CX、DX、BP、SP、SI、DI)。 • 用于给寄存器赋初值。 • 不能直接给段寄存器赋值 • 例: • MOV CL,04H ;立即数8位寄存器 • MOV AX,03FFH ;立即数16位寄存器 • PTR :属性定义符号,符号后面的变量(或地址单元)有符号前面的属性 • MOV WORD PTR [ SI] ,057BH ;立即数存储器 • MOV BYTE PTR MEM, 5 ;立即数存储器
CPU内部寄存器(除CS和IP外) • 与存储器(所有寻址方式)之间数据传送。 • 可以实现一字节或一个字的传送。 • 存储单元之间不能直接传送 • 例: • MOV MEM , AX ; 累加器存储器,直接寻址 • MOV MEM ,DS ;段寄存器存储器,直接寻址 • MOV DISP[BX] ,CX ;寄存器存储器,变址寻址 • MOV AX , DISP [SI];存储器累加器,变址寻址 • MOV DS , MEM ;存储器段寄存器,直接寻址 • MOV CX , DISP [BX] [SI] ;存储器累加器,相对基址加变址
注意: • (1)不能用一条MOV指令实现以下传送。 • 存储单元之间的传送 MOV MEM2 , MEM1 错。 • MOV AX , MEM1 • MOV MEM2 , AX 对。 • 立即数送段寄存器 例 : MOV DS,2000H 错。 MOV AX, 2000 H MOV DS , AX 对。
段寄存器之间的传送 MOV ES , DS ; 错 MOV AX , DS MOV ES , AX ; 对 。 • 注意CS和IP的使用 CS和IP不能作为目标操作数,CS可以作为源操作数。 例: MOV CS,AX ; 错 • MOV AX,CS ;对 。 • MOV IP, AX ;错 • MOV AX, IP ;错。
注意操作数的范围 • 对字节操作指令 0 ~ FFH 0 ~ 255 • 对字操作指令 0 ~ FFFFH 0 ~ 65535 • MOV AL , 260 • MOV AX ,70000 • MOV AL, 1FFH • MOV AL, 2ABCDH
注意如下指令: • ① 不能两个同为存储器操作数 • 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值自动+1 ,指向下条指令。 • 段寄存器CS的值,只在MOV、PUSH中可作操作数, • 且这两条指令执行结果不改变CS值。 • MOV AX, CS • PUSH CS • IP、FR两个寄存器不能作为操作数在指令中出现。 • mov IP , 1234H • mov FR , 0F0FH • FR状态寄存器的值由指令执行后确定, • 不同的指令对各标志的影响不同。
(2)段地址的默认 BX、SI、DI间址默认段地址为DS, BP间址默认段地址SS。 (3) 凡是遇到给SS赋值指令,系统自动禁止外部中断,执行本条指令和下条指令,恢复对SS寄存器赋值前的中断开放情况。 这样做为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程出现中断。 *在修改SS和SP的指令之间不要插入其他指令。 (4) 所有通用传送指令不影响标志位 (除SAHF、POPF以外)。
2. PUSH (Push word onto stack) • POP (Pop word off stack) • 这是两条堆栈操作指令。 • (1) 先介绍一下什么是堆栈,为什么需要堆栈 • 堆栈——按照先进后出原则组织的一段内存区域, • 特点: • 下推式的(规定堆栈设置在堆栈段内)改变SP的内容, • 随着推入堆栈内容增加,SP的值减少。 • 先进后出工作原则(Last In First Out 简称LIFO) • 堆栈在内存中的情况: • (10月20日课讲到此)
堆栈在内存中的情况: • 例: • 设: SS=2000H , SP=40H,BX=2340H • 运行PUSH BX后,SP=SP-2 • 堆栈在内存中的情况如右图所示: 堆栈在内存中的情况
堆栈用途: • 存放CPU寄存器或存储器中暂时不使用的数据, • 使用数据时将其弹出; • 调用子程序, 响应中断时都要用到堆栈。 • 调用子程序(或过程)或发生中断时要保护断点的地址, • 子程序或中断返回时恢复断点。 • 注意:SP——堆栈指针,始终指向栈顶。 • SP初值用MOV SP,i m来设定。
3、交换指令(Exchange) • 格式:XCHG dest , src ;(dest) (src) • 执行操作: • 把一个字节或一个字的源操作数与目的操作数相交换。 • 可以 实现: 寄存器之间 • 寄存器和存储器之间 • 注意: • 存储器之间不能交换,两个操作数中必须有一个在寄存器; • 段寄存器不能作为一个操作数; • 允许字或字节操作,不影响标志位。
应用举例: XCHG BL,DL XCHG AX,SI XCHG COUNT[DI], AX XCHG [BX],[DI] (错) XCHG DS, AX (错)
XLAT(Translate)换码指令:该指令不影响标志位。XLAT(Translate)换码指令:该指令不影响标志位。 • 格式: XLAT str_table ;(AL)←(BX +AL) • 或 XLAT • str_table——表格符号地址(首地址), • 只是为了提高可读性而设置,汇编时仍用BX。
XLAT指令使用方法: • 先建立一个字节表格; • 表格首偏移地址存入BX; • 需要转换代码的序号(相对与表格首地址位移量)存入AL; (表中第一个元素的序号为0) • 执行XLAT指令后,表中指定序号的元素存于AL中。 • (AL)为转换的代码。
XLAT指令应用: 若把字符的扫描码转换成ASCII码; 或数字0~9转换成7段数码所需要的相应代码(字形码)等就要用XLAT指令。 例:内存的数据段中有一张十六进制数字的ASCII码表。 首地址为:Hex_table ,欲查出表中第10个元素(‘A’)
30H '0' Hex_table 31H '1' Hex_table+1 '2' 32H Hex_table+2 ... '9' 39H Hex_table+0AH 41H 'A' Hex_table+0BH 42H 'B' ... Hex_table+0FH 46H 'F' ... 执行指令序列: MOV BX,OFFSET Hex_table MOV AL,0AH XLAT Hex_table 假设: (DS)=F000H, Hex_table=0040H (AL)=0AH 执行XLAT以后: (AL)=41H=(F004AH), 即“A”的ASCII码。 16进制数的ASCII码表
(二)输入输出指令(Input and Output) 输入输出指令共两条: 1、IN (Input byte or word) 2 、OUT (Output byte or word) 输入指令用于CPU从外设端口接受数据, 输出指令用于CPU向外设端口发送数据。 无论接受还是发送数据,必须通过累加器AX(字)或AL(字节), 又称累加器专用传送指令 。 输入、输出指令不影响标志位。
每个外设要占几个端口:数据口,状态口和控制口。每个外设要占几个端口:数据口,状态口和控制口。
信息交换要通过端口, 在IBMPC机里,可以配接许多外部设备, 每个外设与CPU之间交换数据,状态信息和控制命令, 每一种信息交换都要通过一个端口来进行。 端口数:外部设备最多有65536个I/O端口。 A0~A15译码形成。 端口号:端口号(即外设端口地址)为0000H~FFFFH。 PC机仅使用A0~A9译码形成I/O口地址,即1024H个口地址 端口号:0000H~03FFH 其中: A9=1,表示扩充槽上的口地址。
长格式: 端口号中前256个端口(0~FFH),可以直接写在指令中,这就是长格式。 端口号代替指令中的PORT, 机器指令用二字节表示,第二字节就是端口号。 短格式: 当端口号≥256时,只能使用短格式, 必须先把端口号放到DX寄存器中。 不需要用任何段寄存器来修改它的值。
1、IN (Input byte or word) 输入指令 格式:IN acc, port ;(acc) (port) 具体形式有四种: IN AL, data8 ; 端口地址8位,输入一个字节 IN AX, data8 ;端口地址8位,输入一个字 IN AL, DX ;端口地址16位,输入一个字节 IN AX, DX ;端口地址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位,输出一个字 必须通过累加器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)
作业: 3.39(1)~(6),3.44,3.46