1 微机原理及应用 主讲:谢维成 http://xweicheng.ys168.com scxweicheng@yahoo.com.cn 2 西华大学电气信息学院 第 第 3章 章 8086寻址方式和指令系统 寻址方式和指令系统 (3版 版 P43; 4版 版 P24/67) ) 3.1 8086/8088的寻址方式 寻址方式:指出操作数的来源。 1 立即寻址: (如下页图3-1所示) 操作数直接在指令中,紧跟在操作码之 后,作为指令的一部分放在码段中。 例 :MOV AL,64H ;AL←64H MOV AX,2058H ;AX←2058H 3 西华大学电气信息学院 地 址 增 加 存储器 OP 58 20 代 码 段 AX 操作码 ALAH 操作数 图3-1 立即寻址示意图 4 西华大学电气信息学院 立即数只能为整数,且只能做源操作数 立即数只能为整数,且只能做源操作数 MOV AX,2058H ;AX←2058H 目 的 操 作 数 源 操 作 数 5 西华大学电气信息学院 2 寄存器寻址 操作数就在CPU的内部寄存器中,寄存器 名由指令指出。 例 : DEC BL ;将BL的内容减1 MOV DX,AX ;将AX中的值送入DX中 3 直接寻址 操作数的偏移地址(常称有效地址EA)直 接包含在指令中,放在操作码之后,见下页 图2-2 6 西华大学电气信息学院 例 : MOV AX,[1000H] 其示意图如图3-2所示 58 20 ALAH 00 10 21000 20000 存储器 OP 代 码 段 AX 数 据 段 图3-2 直接寻址示意 7 西华大学电气信息学院 对此例,没有用前缀指明操作数在哪 一段 , 则默认在数据段中,设(D S) =2000H,则操作数 的物理地址为:20000+1000=21000H 于是访问该存储器取出其内容送AX 又例 :MOV BX,ES:[1000H] 则是将E S段的1000H及1 001H两单元内容取出送B X。 在汇编语言中,可用 符号地址 代替 数值地址 , 如 : MOV AX,BUFFER ; 其 中 BUFFER为 存 放 操 作 数的符号地址. 而 MOV AX,[BUFFER] 与上式等效 8 西华大学电气信息学院 4 寄存器间接寻址 寄存器间接寻址 利用这种寻址方式时, 操作数在存储器中 ,而 操作数有效地址由 BX、BP、SI 和 DI中的一个指出, 若未用前缀指明,默认关系为: 对BX、SI、DI默认在 DS段中 对BP默认在 SS段中 例: MOV AX,[DI] 设(DS)=3000H,(DI)=2000H 该指令将32000H和 32001H两存储单元中的内容 送AX 9 西华大学电气信息学院 5 寄存器相对寻址 寄存器相对寻址 利用寄存器间接寻址时。允许在指令中指定 一个8位或16位的位移量,这样有效地址EA的构 成为: [BX] [BP] 8位位移量 [SI] 16位位移量 [DI] 例 :MOV AX,[COUNT+BP] 若(SS)==5000H,(BP)=3000H,COUNT=2040H EA= + 10 西华大学电气信息学院 则寻址示意图如图 则寻址示意图如图 3-4所示 所示 存储器 OP 48 55 ALAH 40 20 55040 50000 OP 物理地址为: 50000+3000+2040 =55040H 操作码 代 码 段 位移量 COUNT AX 堆 栈 段 图3-4 寄存器相对寻址示意图 11 西华大学电气信息学院 6 基址加变址寻址 基址加变址寻址 操作数的有效地址是一个基址寄存器内容加 上 一 个 变 址 寄 存 器 内 容 , 默 认 的 段寄存器关系同 上。 例 :MOV AX,[BX+SI] 若(DS)=3200H,(BX)=0456H, (SI)=1094H, 其寻址示意图如下页图3-5所示 12 西华大学电气信息学院 67 45 AX ALAH 32456 334EA (SI) (BX) 物理地址为: 32000+0456+1094 =334EAH 存储器 32000 数 据 段 图3-5 基址加变址寻址示意图 13 西华大学电气信息学院 7 相对的基址加变址寻址 相对的基址加变址寻址 基址加变址也允许带一个8 位 或1 6位的位 移量, 例: MOV AX,[MASK+BX+DI] 设:(DS)=3000H,(BX)=1346H (DI)=0500H,MASK=1234H 其执行情况如下页图3-6所示 14 西华大学电气信息学院 存储器 OP 48 55 ALAH 34 12 32A7A 30000 OP 31346 3257A (DI) (BX) MASK 图3-6 相对的基址 加变址寻址示意图 代 码 段 操作码 位移量 MASK AX 数 据 段 15 西华大学电气信息学院 寻址方式总结 寻址方式总结 (***) 1 2 3 4 1 2 3 4 、立即寻址 、寄存器寻址 、直接寻址 、间接寻址 ( )基址寻址 ( )基址 变址寻址 ( ) 基址 变址 常量地址寻址 ( )变址寻址 + ++ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1、 MOV AX, 235AH 2、 MOV AX, BX 3、 MOV AX, [235AH] 4( 1) MOV AX, [BX] ; MOV AL, [BP] ( 2) MOV AX, [BX+SI]; MOV AX, [BX] [SI] ( 3) MOV AX, [BX+SI+2000H] ( 4) MOV AX, [DI] 16 西华大学电气信息学院 3.2 8086/8088指令系统 3.2.1 数据传送指令 3.2.2 算术运算指令 17 西华大学电气信息学院 3.4 IA-32的通用指令 的通用指令 可分成如下6类: ?数据传送指令 ?算术运算指令 ?逻辑运算和移位指令 ?串操作指令 ?控制转移指令 ?处理器控制指令 18 西华大学电气信息学院 3.4.1 数据传送指令 数据传送指令 用来实现:寄←→寄,C PU← →存 CPU←→I /O 之间的数据传送。这是一种最基 本 、 最重要的操作。这类指令又可分为如下四种: ?通用传送 ?累加器专用传送 ?地址传送 ?标志传送 19 西华大学电气信息学院 1.通用传送指令 通用传送指令 (1) MOV DST,SRC; DST←SRC 传送的是字节还是字取决于指令中涉及 的寄 存器是8位还是16位。 具体来说可实现: ① MOV MEM/REG1 ,MEM/REG2 式中两操作数中至少有一个为寄存器 例: MOV CL,DL MOV AX,BX MOV [SI],CX MOV CL,[BX+5] 20 西华大学电气信息学院 ②MOV REG,DATA ;立即数送寄存器 ③MOV MEM/REG,DATA ④MOV AC,MEM ;存储单元送累加器 ⑤MOV MEM,AC ;累加器送存储单元 ⑥MOV SEGREG,MEM/REG ;段寄 存/寄 ⑦MOV MEM/REG,SEGREG ; 存/寄 段 寄 21 西华大学电气信息学院 对 对 MOV指令小结 指令小结 可执行: 寄←→寄 ;但 CS,IP 不 能 作 目 的 寄 存 器 寄←→存 ;不能:存←存 寄,存←→段寄 ;不能:段寄←段寄 寄←立即数 存←立即数 ;不能:段寄←立即数 22 西华大学电气信息学院 几个不能送的 解决办法 : MOV AL,MEM1 ;通过寄存器AL作桥梁 MOV MEM2,AL ;用来解决存←存 MOV AX,DS ;通过AX解决: MOV ES,AX ;段寄←段寄 MOV AX,DATA ;通过AX解决: MOV DS,AX ;段寄←立即数 23 西华大学电气信息学院 举例: 将1000H开始的100个存储单元送上ASCII 码2AH(*)。程序段如下: MOV DI,1000H MOV CX,64H MOV AL,2AH AGAIN:MOV [DI],AL INC DI DEC CX JNZ AGAIN INT 20H;若(CX)=0,返回DOS 24 西华大学电气信息学院 上程序段存放在 码段 中, 設 (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 INT 20H 109E:0110 25 西华大学电气信息学院 送上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 00 00 00 00 00 00 00 00 00 00 00 00 **** *********** *********** *********** *********** *********** *********** 26 西华大学电气信息学院 CS:IP 存 放指令 SS:SP 堆栈操作 DS+16位偏移量 存放操作数 ES+16位偏移量 存放操作数 一条指令包含两个部分:一部 分是 指令 操作 码,另一部分是操作数字段。前者指出执行什么 样操作,后者指出操作数放在什么地方?结果送 至何处? 27 西华大学电气信息学院 例:M OV DST,SRC ;目的源操作数放在什么地方? 即所谓寻址方式 寻址方式有7种: 立即寻址;寄存器寻址 直接寻址;寄存器间接寻址 寄存器相对寻址 基址加变址寻址 相对的基址加变址寻址 28 西华大学电气信息学院 (2)堆栈操作指令 堆栈操作指令 (3版 版 P53; 4版 版 P74) ) 堆栈:在内存中开辟若干单元作 为栈 区 , 按 “后进先出 ” 方式工作。 为什么要设置堆栈? 为什么要按 “后进先出 ” 方式工作? 参见图3-7 29 西华大学电气信息学院 IP 执 行 子 程 序 转 子 程 序 压 栈 弹 出 返 回 主 程 序 IP(下 ) 继 续 执 行 主 程 序 转 子 程 序 1 返 回 主 程 序 IP’ 执 行 子 程 序 2 转 子 程 序 2 返 回 子 程 序 1 IP’(下 ) 执行子 程序 1 继 续 执 行 子 程 序 1 (b) 压 栈 弹 出 主程序 主程序 IP 继 续 执 行 主 程 序 (a) 图 3-7 子程序调用示意图 (a) 主程序调子程序; (b) 子程序嵌套示意图 30 西华大学电气信息学院 堆栈规定设置在堆栈段S S内,堆栈指针 SP始 终 指向堆栈的顶部,S P的初值规定了所 用堆栈区的大小。堆栈的最高地址叫 栈底 。 ① 压栈指令 PUSH SRC 例: PUSH AX ;将AX内容压栈 执行操作:(SP)-1←高字节AH (SP)-2←低字节AL (SP)←(SP)-2 31 西华大学电气信息学院 设(AX)=1020H,执行示意图如图3-8 执行前 (AX)=1020 10 图3-8 PUSH AX指令执行示意图 存储区 ( SS段) 存储区 ( SS段) 低地址 低地址 20(SP) AL (SP)-2 AH (SP)-1 (SP) 进栈方向 执行后 32 西华大学电气信息学院 注意进栈方向是高地址向低地址发展。 注意进栈方向是高地址向低地址发展。 压栈指令的格式为: PUSH REG PUSH MEM/REG PUSH SEGREG ② 弹出指令 POP DST 例: POP BX ;将栈顶内容弹至BX 执行操作:(BL)←(SP) (BH)←(SP)+1 (SP)←(SP)+2 33 西华大学电气信息学院 POP BX 的执行示意图如图3-9所示 存储区 ( SS段) 低地址 出栈方向 执行前 20 10 图3-9 POP BX指令执行示意图 执行后 (BX)=1020 10 存储区 ( SS段) 低地址 (SP) 20 (SP)+1 (SP)+2 (SP) 34 西华大学电气信息学院 POP指令的格式同P USH指令,堆栈指令使用时应注 意两点:①堆栈操作总是按 字 进行 ②不能从栈顶弹出一个字给 CS 堆栈示意图 : 存储区 ( SS段) … 低地址 栈顶 (SP) 堆栈最后 一个字 进栈方向 栈底 35 西华大学电气信息学院 (3) 交换指令 交换指令 XCHG 格式为:XCHG REG,MEM/REG 要求两操作数中必须有一个在寄存器中, 不允许使用段寄存器。 举例: XCHG AX,BX XCHG [2000],CL 36 西华大学电气信息学院 2. 累加器专用传送指令 累加器专用传送指令 所谓 专用 只限于用 累加器AL或AX 来传送信息。 完成的操作:CPU ?I/O端口 (1) 输入指令IN 格式:IN ac,PORT ;PORT端口号0~255H IN ac,DX ;DX表示的端口范围达64K 例: IN AL,80H ;(AL)←(80H) IN AX,DX ;(AX)←((DX)+1,(DX)) 37 西华大学电气信息学院 (2)输出指令 输出指令 OUT 格式:OUT PORT,ac OUT DX,ac 例: OUT 68H,AX ;(68+1,68H)←(AX) OUT DX,AL ;((DX))←(AL) 在使用间接的IN/OUT指令时,在指令执行前, 应用传送指令对DX寄存器设置好端口号, 如: MOV DX,220H IN AL,DX ;将220H端口内容读入AL 38 西华大学电气信息学院 (3)换码指令XLAT 执行的操作:(AL)←[(BX)+(AL)] 又叫 查表转换指令 ,它可根据表中代码的序号查 出 表中对应代码的内容。执行时先将表的首地址 (偏移地址)送到BX中,代码序号存于AL中。 例如: 内存数据段有一张16进制数的A SCII码 表 , 设 首 地址为2000H ,如图3-10所示,如欲查出 表中第11个代码(代码序号从0开始)即 B 的 ASCII码,(表中地址设(DS)=4000H) 39 西华大学电气信息学院 30 31 32 ... ‘0’ ‘1’ ‘2’ 39 41 42 ... ‘9’ ‘A’ ‘B’ 存储器 42000H+0 42000H+11 45 46 ... ‘E’ ‘F’ 图3-10 十六进制数ASCII码表 40 西华大学电气信息学院 则可用如下几条指令实现: MOV BX,2000H ;(BX)←表首地址 MOV AL,0BH ;(AL)←序号 XALT ; 查表转换 执行后得到:(AL)=42H 41 西华大学电气信息学院 3.地址传送指令 共有三条,我们只介绍LEA指令: 格式: LEA REG,MEM ; 将指定存储器的16位偏址送指定 寄 存 器. 指令要求 源操作数 必须是一个 内存 操作数 ,目的操作数必须是一个1 6位的 通用寄存器。 42 西华大学电气信息学院 例: 例: LEA BX, , [SI+10H] 设:(SI)=1000H 则执行该指令后,(BX)=1010H 注意以下两条指令差别: LEA BX,BUFFER 和 MOV BX,BUFFER 前者表示将符号地址为BUFFER的存储单 元的偏侈地址取到BX中; 后者表示将BUFFER 存储单元中的内容取到BX中。 43 西华大学电气信息学院 下面两条指令等效: LEA BX,BUFFER 和 MOV BX, OFFSET BUFFER 其中OFFSET BUFFER表示存储器BUFFER的偏移 地址。 44 西华大学电气信息学院 4.标志传送指令 共有四条: (1)读标志指令 LAHF 本指令把标志寄存器低8位中的5个标 志位传送到AH中的指定位,如下图2-11 所示: 45 西华大学电气信息学院 1 D 3 D 5 D 7 D 6 D 4 D 2 D 0 D AH OF DF IF TF SF ZF AF PF CF (2) 设置标志指令 SAHF SAHF的 功 能 与 LAHF的 功 能 正 好 相 反 , 用 图 来 示 意 , 只 要 将 图2-11中5个箭头方向反一下即可。 FLAG 图 3-11 LAHF指令的功能 46 西华大学电气信息学院 1 D 3 D 5 D 7 D 6 D 4 D 2 D 0 D AH OF DF IF TF SF ZF AF PF CF FLAG 图3-11 SAHF指令的功能 (3) 设置标志指令 SAHF SAHF的 功 能 与 LAHF的 功 能 正 好 相 反 , 用 图 来 示 意 , 只 要 将 图2-11中5个箭头方向 反一下 即可。 47 西华大学电气信息学院 (3)把标志寄存器推入栈顶指令 PUSHF 执行的操作:(SP)-1←标志寄存器高8位 (SP)-2←标志寄存器低8位 (SP) ←(SP)-2 (4)从栈顶弹出标志寄存器指令 POPF 执行的操作:标志寄存器低8位 ← (SP) 标志寄存器高8位←(SP)+1 (SP)←(SP)+2 PUSHF和P OPF指令用于保护和恢复标志寄存 器内容 48 西华大学电气信息学院 例如: PUSH AX PUSH CX PUSHF . 程序要用到AX,CX以及标志位, . 执行时可能改变 POPF ;恢复时,后入栈先弹出 POP CX POP AX 对标志位的影响,除S AHF和P OPF这两 条 指 令 外,其余所有指令均不影响标志位。 49 西华大学电气信息学院 3.4.2 算术运算指令 算术运算指令 算术运算指令涉及 两种类型数据 ,即无 符号数和有符号数。对加法指令和减法指 令而言,无符号和有符号数可采用同一套 指令,其条件有两个: ? 一是参加的操作数必须同为无符号数或同 为有符号数。 ? 二是要采用不同标志位来检查无符号数和 有符号数的运算结果是否溢出。 50 西华大学电气信息学院 ? 下面看一下两个8位数相加时的4种情况: ①无符号数和有符号数均不溢出 二进制相加 无符号数加 有符号数加 0000 1000 8 +8 +0001 1110 +30 +(+30) 0010 0110 38 +38 结果38 CF=0 OF=0 51 西华大学电气信息学院 ② 无符号数溢出 0000 1000 8 +8 +1111 1101 +253 +(-3) 10000 0101 261 +5 结果5 CF=1 OF=0 ③ 有符号数溢出 0000 1000 8 +8 +0111 1101 +125 +(+125) 1000 0101 133 +133 结果-123 CF=0 OF=1 (补码表示) 52 西华大学电气信息学院 ④ 无符号数和有符号数均溢出 1000 1000 136 -120 +1111 0111 +247 +(-9) 10111 1111 383 -129 结果127 CF=1 OF=1 上面四种情况清楚说明, CF标 志 可用来表示无 符号数的溢出, OF标志可用来表示有符号数的溢 出。 需要指出的是有符号数的溢出是一种 出错 ,在 运算过程中应当避免。 53 西华大学电气信息学院 1. 加法指令 加法指令 共有5条指令: (1) 不带进位的加法指令ADD. 格式有:ADD ac,data ADD mem/reg,data ADD mem/reg1,mem/reg2 例: ADD AL,30H ADD AX,[BX+20H] ADD CX,SI ADD [DI],200H ADD指令对标志位(指状态标志)都有影响. 54 西华大学电气信息学院 (2) 带进位的加法指令 带进位的加法指令 ADC ADC指令在形式上和功能上都有与ADD类似,只是 在相加时要把进位标志的现行值CF加到和中, 例如: ADC AL,68H ADC AX,CX ADC BX,[DI] 55 西华大学电气信息学院 ADC指令主要用于多字节加法运算中. 例: 有两个4字节的无符号数相加: 2C56F8AC+309E47BE=? 设被加数、加数分别存放在BUFFER1及BUFFER2 开始的两个存储区内,要求和放回BUFFER1存储区, 如下页图所示。 因CPU只能进行8位或16位的加法运算,为此可将 加法分4次进行. 56 西华大学电气信息学院 56H 2CH BEH 47H BUFFER1 ACH BUFFER2 F8H 9EH 30H . . . 被 加 数 数 据 段 加 数 ... 图3-12 多字节加法示意图 57 西华大学电气信息学院 程序段如下: MOV CX,4 ;置循环次数 MOV SI,0 ;置SI初值为零 CLC ;清进位标志CF AGAIN:MOV AL,BUFFER2[SI] ADC BUFFER1[SI],AL ;带进位加 INC SI ;(SI)+1 DEC CX ;(CX)-1 JNZ AGAIN ;若(CX) ≠0,则转AGAIN INT 20H ;返回DOS 其中: MOV AL,BUFFER2[SI]和 MOV AL,[BUFFER2+SI]等效 思考: 若最高位有进位,如何改?