3.38086/8088指令系统 可分成如下6类: ■数据传送指令 ■算术运算指令 ■逻辑运算和移位指令 ■串操作指令 程序控制指令 处理器控制指令
1 3.3 8086/8088指令系统 可分成如下6类: ◼ 数据传送指令 ◼ 算术运算指令 ◼ 逻辑运算和移位指令 ◼ 串操作指令 ◼ 程序控制指令 ◼ 处理器控制指令
3.3.1数据传送指令 可实现 存储器←→寄存器←→I/0 数据传送指令又可分为如下四种: 通用传送 目标地址传送 ■标志传送 ■输入输出
2 3.3.1 数据传送指令 ⚫ 可实现 存储器 寄存器 I/O ⚫ 数据传送指令又可分为如下四种: ◼ 通用传送 ◼ 目标地址传送 ◼ 标志传送 ◼ 输入输出
1.通用传送指令 (1mov dest, src: dest+src 传送的是字节还是字取决于指令中涉及的寄 存器是8位还是16位。 具体来说可实现: O MOv mem/regl, mem/reg2 指令中两操作数中至少有一个为寄存器 例: MOV CL,DL MOV AX, BX MOv SI, CX MOV CL,BX+5
3 1.通用传送指令 (1) MOV dest,src; dest←src 传送的是字节还是字取决于指令中涉及的寄 存器是8位还是16位。 具体来说可实现: ① MOV mem/reg1,mem/reg2 指令中两操作数中至少有一个为寄存器 例: MOV CL,DL MOV AX,BX MOV [SI],CX MOV CL,[BX+5]
② MOv reg,data;立即数送寄存器 ③ MOv mem,data 立即数送存储单元 ④ Mov acc,mem ;存储单元送累加器 ⑤ MOv mem,acc ;累加器送存储单元 6 Mov segre,mem/reg;存储单元/寄存器送 段寄存器 ⑦ MOv mem/reg, segre;段寄存器送存储单 元/寄存器
4 ② MOV reg,data ;立即数送寄存器 ③ MOV mem,data ;立即数送存储单元 ④ MOV acc,mem ;存储单元送累加器 ⑤ MOV mem,acc ;累加器送存储单元 ⑥ MOV segreg,mem/reg ;存储单元/寄存器送 段寄存器 ⑦ MOV mem/reg,segreg ;段寄存器送存储单 元/寄存器
MOV指令使用规则: 1)IP不能作目的寄存器 2)不允许 mem mem 3)不允许 segre← segre 4)立即数不允许作为目的操作数 5)不允许 segre←立即数 6)源操作数与目的操作数类型要一致
5 MOV指令使用规则: 1) IP不能作目的寄存器 2) 不允许mem←mem 3) 不允许segreg←segreg 4) 立即数不允许作为目的操作数 5) 不允许segreg←立即数 6) 源操作数与目的操作数类型要一致
几个不能传送的解决办法:用AX作桥梁 ●存储器←存储器: Mov AX, MEM1 Mov MEM2, AX ●段寄存器←段寄存器: MOV AX, DS MOV ES, AX ●段寄存器←立即数 Mov AX, DATA MOV DS, AX
6 几个不能传送的解决办法:用AX作桥梁 ⚫ 存储器←存储器: MOV AX,MEM1 MOV MEM2,AX ⚫ 段寄存器←段寄存器: MOV AX,DS MOV ES,AX ⚫ 段寄存器←立即数: MOV AX,DATA MOV DS,AX
●应用举例:将100OH开始的100个存储单元 全部填充为 ASCII码2AH(*) 程序段如下: MOV dI, 1000H MOV CX, 64H MOV AL, 2AH AGAIN: MOV DI, AL INC DI DEC CX JNZ AGAIN HLT
7 ⚫应用举例:将1000H开始的100个存储单元 全部填充为ASCII码2AH(*)。 程序段如下: MOV DI,1000H MOV CX,64H MOV AL,2AH AGAIN:MOV [DI],AL INC DI DEC CX JNZ AGAIN HLT
上程序段存放在代码段中,設(CS)=109HH, 则各条指令存放地址如下: 指令 109E:0100 MOV dI, 1000H 109E:0103 MOV CX, 64H 109E:0106 MOV AL, 2AH 109E: 0108 MOV DI, AL 109E:010A INC DI 109E:010B DEC CX 109E:010CJNZ0108 109E:010E HLT 109E:0110
8 上程序段存放在代码段中,設(CS)=109EH, 则各条指令存放地址如下: CS : IP 指令 109E : 0100 MOV DI,1000H 109E : 0103 MOV CX,64H 109E : 0106 MOV AL,2AH 109E : 0108 MOV [DI],AL 109E : 010A INC DI 109E : 010B DEC CX 109E : 010C JNZ 0108 109E : 010E HLT 109E : 0110
写入2AH(*)后,数据段中相应存储单元的内容改 变如下: DS: 1000 2A2A2A 2A2A 2A2A 2A2A2A 2A2A 2A2A 2A 2A DS: 1010 2A2A 2A 2A2A2A2A2A 2A 2A2A2A2A2A2A 2A DS: 1020 2A 2A2A2A 2A 2A2A 2A 2A2A2A 2A 2A2A2A 2A DS: 1030 2A2A 2A 2A2A 2A 2A2A 2A 2A2A 2A 2A2A2A 2A DS: 1040 2A2A2A 2A2A 2A2A2A 2A2A 2A2A2A 2A2A 2A DS: 1050 2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A 2A DS:10602A2A2A2A
9 写入2AH(*)后,数据段中相应存储单元的内容改 变如下: DS:1000 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1010 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1020 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1030 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1040 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1050 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1060 2A 2A 2A 2A
(2)堆栈操作指令 什么是堆栈? 按“后进先出①LIFO)”方式工作的存储区 域。堆栈以字为单位进行压入弹出操作 为什么要设置堆栈? 为什么要按“后进先出”方式工作? 参见下图
10 什么是堆栈? 按“后进先出(LIFO)”方式工作的存储区 域。堆栈以字为单位进行压入弹出操作。 为什么要设置堆栈? 为什么要按 “后进先出”方式工作? 参见下图 (2) 堆栈操作指令