微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月09日
微机原理与接口技术 8086指令系统 朱华贵 2015年10月09日
3.3 8086指令系统 8086指令系统包括六大类指令: 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令 处理器控制指令
1、指令助记符 数据 传送 算术 运算 逻辑 操作 指令类型 助记符 通用传送 MOV,PUSH,POP,XCHG,XLAT 地址传送 LEA,LDS,LES 标志传送 PUSHF,POPF,LAHF,SAHF 输入输出 IN,OUT 算术 运算 加法 ADD,ADC,INC,AAA,DAA 减法 SUB,SBB,DEC,NEG,CMP,AAS,DAS 乘法 MUL,IMUL,AAM 除法 DIV,IDIV,AAD 符号扩展 CBW,CWD 逻辑 操作 逻辑运算 AND,TEST,OR,XOR,NOT 移位 SHL,SAL,SHR,SAR 循环移位 ROL,ROR,RCL,RCR
指令类型 助记符 串 串操作 处理 重复控制 无条件转移 控制 条件转移 转移 循环控制 过程调用 中断指令 处理机控制 MOVS,CMPS,SCAS,LODS,STOS 重复控制 REP,REPZ/REPE,REPNZ,REPNE 控制 转移 无条件转移 JMP 条件转移 JE/JZ,JNE/JNZ,JS,JNS,JO,JNO JP,JNP,JC,JNC,JCXZ JA/JNBE,JAE/JNB,JB/JNAE,JBE/JNA JG/JNLE,JGE/JNL,JL/JNGE,JLE/JNG 循环控制 LOOP,LOOPZ/LOOPE,LOOPNE/LOOPNZ 过程调用 CALL,RET 中断指令 INT,INTO,IRET 处理机控制 CLC,STC,CMC,CLD,STD,CLI,STI NOP,HLT,WAIT,ESC,LOCK
2、学习指令要点 从以下几个方面来掌握一条指令: 指令的助记符 指令的格式:操作数的个数、类型 执行的操作:指令执行后的结果。包括:哪些寄存器、内存单元的值发生了变化,对标志位有没有影响,受哪些影响。 特点及注意事项 只介绍常用的指令,其他需要时可自学
3、利用DEBUG学习寻址方式、指令系统 例:D:\>DEBUG ;进入DEBUG -A ;汇编指令 1395:0100 MOV BX,2000 1395:0103 MOV [BX],CS -R ;查看指令执行前寄存器的内容 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1395 ES=1395 SS=1395 CS=1395 IP=0100 NV UP EI PL NZ NA PO NC 1395:0100 BB0020 MOV BX,2000 -D DS:2000 L20;查看指令执行前内存单元的内容 1395:2000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1395:2010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -T ;单步执行指令 AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1395 ES=1395 SS=1395 CS=1395 IP=0103 NV UP EI PL NZ NA PO NC 1395:0103 8C0F MOV [BX],CS DS:2000=0000 DS=1395 ES=1395 SS=1395 CS=1395 IP=0105 NV UP EI PL NZ NA PO NC 1395:0105 0000 ADD [BX+SI],AL DS:2000=95 -D DS:2000 L10;查看指令执行前内存单元的内容 1395:2000 95 13 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ Q;退出
4、指令中操作数的表示 符号 表示内容 data 立即数操作数 reg 通用寄存器操作数 8位:AH、AL、BH、BL、CH、CL、DH、DL 16位:AX、BX、CX、DX、BP、SP、SI、DI segreg 段寄存器:DS、CS、SS、ES mem或[ ] 存储器操作数(5种寻址方式) src 源操作数 dst 目的操作数 ( ) 寄存器、存储器、端口的内容 oprd1、oprd2 两操作数
5、书写指令注意事项 不区分大小写 不添加指令系统没有的指令,即不自创助记符 注意操作数的范围 对无操作数指令,不添加操作数 对单操作数指令,操作数不能是立即数 …
1. 数据传送指令类 ◆数据传送类指令一共有14条。这里主要介绍: MOV 传送 PUSH 压入堆栈 POP 弹出堆栈 XCHG 交换 LEA 取偏移 IN 输入端口“读” OUT 输出端口“写” ◆数据传送类指令均不影响标志位。 ◆数据类型字节(byte)/字(word)。绝大多数是双操作数,两个操作数(字节/字)类型必须一致。 ◆寻址方式基本与MOV 指令的要求相同。
数据传送指令 传送指令 MOV 格式:MOV dst,src 操作:dst←(src) 双操作数寻址方式: reg(寄存器) reg| mem| data(立即数)| segreg mem(内存) reg| data| segreg segreg(段寄存器) reg| mem ◆两个操作数类型(字节/字)要一致。 ◆目的操作数不能是立即数,两个操作数不能都是内存寻址方式。
堆栈操作指令 ◆堆栈是一个“先进后出”的内存数据存取区域。堆栈逻辑地址SS: SP 。 PUSH 和POP 是一对堆栈操作指令: ◆堆栈是一个“先进后出”的内存数据存取区域。堆栈逻辑地址SS: SP 。 ◆数据进入堆栈的操作为压入(PUSH),从堆栈取出数据的操作为弹出(POP)。堆栈操作是单操作数指令, 只能是字类型数据。 压入指令PUSH 格式:PUSH src 操作: ⑴(SP)-2→SP ⑵(src)→(SP) 操作数寻址:src = |mem |reg |segreg SS:0000 SS: SP 栈顶 栈底
堆栈操作指令 弹出指令POP 格式:POP dst 操作: ⑴ ((SP))→dst ⑵ (SP)+2→SP 操作数寻址:dst = mem|reg|segreg 例如 : PUSH AX ;AX→(SS : SP) PUSH [BX] ;(DS : BX)→(SS : SP) POP CX ;(SS : SP)→CX PUSH CL ;错误,堆栈操作必须是字类型数据 POP 200 ;错误,立即数不能是堆栈操作数据
数据交换指令 交换指令XCHG 格式: XCHG opr1,opr2 操作: (opr1)←→(opr2) 操作数寻址: opr1=reg opr2= reg |mem 注意:不可以直接把两个内存数据交换。 例如: MOV AX, [2000H] ;(DS : 2000H)→AX XCHG AX, [BX] ;AX和(DS : BX)交换 MOV [2000H], AX ;AX→(DS : 2000H)
查表换码指令 查表换码指令XLAT 格式: XLAT ; 无操作数 操作: AL←DS:(BX+AL) ; 隐含操作数寻址 注意: BX为表头的EA, AL是距离表头的位移量 。表最大容量为256个字节。 例如: MEM DB ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ MOV BX, OFFSET MEM 或 LEA BX,MEM MOV AL, 2 XLAT ; AL= 43H(‘C’的ASCII码值)
XLAT指令用法举例 若(DS)=2000H,(BX)=0020H,(AL)=9H, 则执行指令XLAT后,(AL)=39H。
装偏移地址指令 装偏移指令LEA 格式: LEA dst,src 操作: src的偏移址→dst 操作数寻址: dst= reg src = mem 例如: MEM DB ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ LEA BX, MEM ;BX取MEM数据表头的EA (等同于:MOV BX,OFFSET MEM ) MOV AL, [BX+2] ;AL= 43H(‘C’的ASCII码值)
输入/输出(I/O)指令 ◆I/O接口指令的语句格式: IN AL ,〈端口地址〉 OUT 〈端口地址〉, AL ◆I/O接口指令的端口地址16位,地址范围为0000H ~FFFFH。若端口地址为 00H ~FFH(0~255),可以直接给出;超出该范围的端口地址必须存放在DX寄存器,间接给出。 例如: IN AL , 80H ;与 MOV AL,80H 的区别 OUT 20H , AL ;与 MOV [20H],AL 的区别 MOV DX, 100H ;DX=100H OUT DX, AL ;与 MOV DX,AX 的区别 IN AL, [80H] ;错误,端口寻址不能用方括号
标志传送指令 (1)取标志指令LAHF 格式:LAHF 该指令中的源操作数隐含为标志寄存器低8位,目标操作数隐含为AH。 (2)置标志指令SAHF 格式:SAHF 该指令中的源操作数隐含为AH,目标操作数隐含为标志寄存器。 功能:把寄存器AH中内容送至16位的标志寄存器低8位,此操作是LAHF的逆操作。
【例3-1】 编写汇编程序段,把标志寄存器的CF位求反,其他位不变。 LAHF ;取标志寄存器的低8位 XOR AH,01H ;最低位求反,其他位不变 SAHF ;送入标志寄存器的低8位 OF 11 15 12 DF 10 IF 9 TF 8 SF 7 ZF 6 5 AF 4 3 PF 2 1 CF
(3)标志入栈指令PUSHF 格式:PUSHF 该指令中的源操作数隐含为标志寄存器,目标操作数隐含为堆栈区。 功能:标志寄存器入栈。 (4)标志弹出指令POPF 格式:POPF 该指令中的源操作数隐含为堆栈区,目标操作数隐含为标志寄存器。 功能:数据出栈到标志寄存器。
【例3-2】 编写汇编程序段,把标志寄存器TF位清零,其他标志位不变。 PUSHF ;标志寄存器入栈 POP AX ;取标志寄存器内容 AND AX,0FEFFH ;TF清零,其他位不变 PUSH AX ;新值入栈 POPF ;送入标志寄存器 OF 11 15 12 DF 10 IF 9 TF 8 SF 7 ZF 6 5 AF 4 3 PF 2 1 CF
2. 算术运算指令类 ◆算术运算类指令一共有20条,分成加、减、乘、(整)除指令和BCD码调整指令五组。这里主要介绍加、减、乘、除14条指令: ADD 加法 ADC 进位加 INC 加1 SUB 减法 SBB 借位减 DEC 减1 CMP 比较 NEG 求补 MUL 无符号乘法 IMUL 有符号乘法 DIV 无符号除法 IDIV 有符号除法 CBW 字节符号扩展 CWD 字符号扩展 ◆算术运算类指令基本都均影响标志位(ZF、SF、CF、OF)。 ◆绝大多数是双操作数,操作数可为字节/字类型。 ◆寻址方式与MOV 指令基本相同。
加法运算指令 加法指令ADD 格式: ADD dst,src ;(dst)+(src) → dst 进位加指令ADC 格式: ADC dst,src ; (dst)+(src)+ CF → dst 加1指令INC 格式: INC dst ;(dst)+ 1 → dst 操作数寻址方式: dst src reg reg|mem|data mem reg|data
减法运算指令 减法指令SUB 格式: SUB dst,src ;(dst)-(src)→ dst 借位减指令SBB 格式: SBB dst,src ;(dst)-(src)- CF → dst 减1指令DEC 格式: DEC dst ;(dst)- 1→dst 操作数寻址方式: dst src reg reg|mem|data mem reg|data
减法运算指令 比较指令CMP 求补指令 NEG 格式: CMP dst,src 格式: NEG dst 操作: 0 -(dst)→ dst ; 求互补码 例如:计算 12345678H + 80A7FD28H MOV DX, 1234H MOV AX, 5678H ;DX|AX= 12345678H ADD AX, 0FD28H ADC DX, 80A7H ;DX|AX= 92DC53A0H
乘法运算指令 无符号乘法指令MUL 有符号乘法指令IMUL 格式: MUL src IMUL src 操作数寻址:src = reg|mem 操作:有/无符号数的乘法 字节乘法:(AL)×(src)→AX 字乘法: (AX)×(src)→DX|AX(32位) 标志位:ZF, SF无定义。乘积的高阶部分如果非0,OF,CF均被置1。 例如: 无符号数字节乘法 0FFH×1= 00FFH 有符号数字节乘法 0FFH×1= 0FFFFH
除法运算指令 无符号除法指令DIV 有符号除法指令IDIV 格式: DIV src IDIV src 操作数寻址:src = reg|mem 操作:有/无符号数的除法 字节除法:(AX)/(src)→AL(商),AH(余数) 字除法:(DX|AX)/(src)→AX(商),DX(余数) 注意: 1.除法可能有0作除数错误;商超出字节/字范围的溢出错误。 2.有符号数除法的余数与被除数的符号相同。
符号扩展指令 符号扩展指令CBW和CWD 格式:CBW ; 把有符号数AL扩展为AX CWD ; 把有符号数AX扩展为DX | AX 操作数: 隐含寻址(AL/ AX/ DX ) 标志位:不改变。 例如: MOV AL,07FH CBW ;AX=007FH MOV AX,8003H CWD ;AX= 8003H, DX= 0FFFFH
乘/除法指令应用例 例如: MUL AH ;无符号数 (AL)×(AH)→AX IMUL AL ;有符号数 (AL)×(AL)→AX MUL BX ;无符号数 (AX)×(BX)→DX|AX MUL word ptr [BX] ; (AX)×((BX))→DX|AX 例如:计算30200除以1500。 MOV AX,30200 ; AX =30200 CWD ; AX扩展为 DX| AX MOV BX,1500 DIV BX ;AX=20(商),DX=200(余数) 例如,如果 AX=0010H(+16),BL=0FDH(-3) IDIV BL ;AX=01FBH,商=-5,余数=1
【例3-3】 编写汇编程序段,计算:( V - ( X * Y + Z - 100 )) / X。 已知:X、Y、Z、V均为16位符号数,已分别装入X、Y、Z、V单元中,要求将上式计算结果的商存入AX,余数存入DX。
MOV AX,X ;取被乘数X IMUL Y ;X*Y,结果在DX、AX中 MOV CX,AX ;将乘积存在BX、CX中 MOV BX,DX MOV AX,Z ;取被加数Z CWD;将符号扩展后的Z加到BX、CX中的乘积上 ADD CX,AX
ADC BX,DX SUB CX,100 SBB BX,0 ;从BX、CX中减去100 MOV AX,V CWD SUB AX,CX ;从符号扩展后的V中减去(BX、CX) SBB DX,BX ;并除以X,商在AX中,余数在DX中 IDIV X
【例3-4】 编写汇编程序段,用压缩BCD码编码并计算37D-19D。 MOV AL,37H SUB AL,19H ;AL=1EH,AF=1,CF=0 DAS ;AL=18H,AF=1 通过DAS这条指令来确认上述减法计算为十进制运算
3. 逻辑运算和移位指令 ◆逻辑运算和移位类指令是以2#数位为单位的“位操作”指令,逻辑运算指令5条,移位指令8条。 NOT 逻辑非 AND 逻辑与 OR 逻辑或 XOR 逻辑异或 TEST 位测试 SHL 逻辑左移 ROL 循环左移 SHR 逻辑右移 ROR 循环右移 SAL 算术左移 RCL 带进位循环左移 SAR 算术右移 RCR 带进位循环右移 ◆操作数可为字节/字类型,按位进行逻辑运算。 ◆多数情况不改变标志位。
逻辑运算指令 逻辑非指令NOT 格式:NOT dst ; 求(dst)的互反码 逻辑与指令 AND 逻辑或指令 OR 逻辑异或指令XOR 格式:AND dst,src 操作:(dst)∧(src)→dst OR dst,src (dst)∨(src)→dst XOR dst,src (dst)⊕(src)→dst 测试指令TEST 格式: TEST dst,src 操作:(dst)∧(src); 不保存结果,仅改变标志位
【例3-5】 编写汇编程序段,将寄存器AX清零。 XOR AX,AX 还有哪些可以将AX清零的指令?比较之。
指令 时钟数 指令字节数 8088 286 386 486 Pentium MOV AX, 0 4 3 2 1 AND AX, 0 XOR AX, AX SUB AX, AX MOV BL, 0 MUL BL 143 21 38 42 11 1.MOV AX, 0 ;在8088、286、386、486、Pentium中时钟数分别为: 4、3、2、1、1 指令长度 2字节 2.AND AX, 0 ;在8088、286、386、486、Pentium中时钟数分别为: 4、3、2、1、1 指令长度 3字节 3.XOR AX, AX ;在8088、286、386、486、Pentium中时钟数分别为:3、2、2、1、1 指令长度 2字节 4.SUB AX, AX ;在8088、286、386、486、Pentium中时钟数分别为:3、2、2、1、1 指令长度 3字节 5.MOV BL, 0; 在8088、286、386、486、Pentium中时钟数分别为: 4、3、2、1、1 指令长度 2字节 MUL BL ; 在8088、286、386、486、Pentium中时钟数分别为:143、21、38、42、11 指令长度 3字节
移位指令 逻辑左移 SHL 逻辑右移 SHR 算术左移 SAL 算术右移 SAR 循环左移 ROL 循环右移 ROR 带进位循环左移 RCL 带进位循环右移 RCR 格式: <移位指令> dst,cnt 操作数寻址:dst是移位的对象,dst=reg|mem cnt是移位的位数,cnt=1|CL 标志位:ZF 和SF,指明移位结果的设置。 CF :左移取自dst最高位,右移取自dst 的D0位。
移位指令 移位指令可以对寄存器或存储单元的内容按字节或字进行操作。
循环移位指令
【例3-6】 设无符号数X在寄存器AL中,用移位指令实现X * 10的运算。 MOV AH,0 SAL AX,1 ;AX←数X*2 MOV BX,AX MOV CL,2 SAL AX,CL ;AX←数X*8 ADD AX,BX ;AX←数X*10
例:设AL = 0101 0100B,CF = 1,CL = 4,则: ROL AL,1 ;AL=10101000B,CF=0,OF=1 ROR AL,1 ;AL=00101010B,CF=0,OF=0 RCL AL,1 ;AL=10101001B,CF=0,OF=1 RCR AL,CL ;AL=10010101B,CF=0,OF无定义
逻辑运算和移位指令应用例 AND AL, 50H ;AL=(AL)∧50H OR AX, [8080H] ;AX=(AX)∨(DS : 8080H) XOR AX, AX ;AX= 0,CF= 0 AND AL, 0FH ;AL高4位清0,低4位保留 OR AL, 0FH ;AL高4位保留,低4位置1 XOR AL, 0FH ;AL高4位保留,低4位取反 ; AX乘以10 MOV DX,0 SAL AX,1 RCL DX,1 MOV BX,AX MOV CX,DX SAL AX,1 RCL DX,1 SAL AX,1 RCL DX,1 ADD AX,BX ADC DX,CX ;双字算术右移 SAR DX,1 RCR AX,1 DX CF AX CF SAR DX,1 RCR AX,1
6. 处理器控制指令 ◆标志位设置指令: CLC CF=0 STC CF=1 CMC CF取反 CLD DF=0 STD DF=1 CLI IF=0 STI IF=1 ◆CPU控制指令: NOP 无操作(空操作) HLT 停机(暂停,等待外部中断,中断后恢复运行) WAIT 等待(等待测试信号TEST, 恢复运行)
4.串操作指令 所谓“串”是指一组数据。 串操作指令的操作对象不是一字节或一个字,而是内存中地址连续的一组字节或一组字。 在默认的情况下,串操作指令的源串存于数据段,目标串存于附加段。在每一次基本操作后,能够自动修改源及目标地址为下一次操作做好准备。串操作指令前通常加上重复前缀,此时,基本操作在满足条件的情况下得到重复,直至完成预设次数。
(1)基本串操作指令 (1)串传送指令 格式一:MOVS dst,src 格式二:MOVSB 格式三:MOVSW 功能:(ES: DI) ← (DS:SI);SI←SI + 1 / 2;DI←DI + 1 / 2
MOVS指令使用说明 格式一中的dst,src仅为了增加程序的可读性。 字节操作时,使用格式二,地址调整量是1;字操作时,使用格式三,地址调整量是2。 地址是增或减由标志位DF决定:DF = 0,地址增;DF = 1,地址减。 寻址方式规定为寄存器间接寻址:源操作数隐含为数据段,偏移地址由寄存器SI指明,允许段超越。 目标操作数隐含为附加段,偏移地址由寄存器DI指明,不允许段超越。
(2)串装入指令 格式一:LODS src 格式二:LODSB 格式三:LODSW 功能:AL ← (DS:SI);SI ← SI + 1 / 2
(3)串送存指令 格式一:STOS dst 格式二:STOSB 格式三:STOSW 功能:(ES:DI) ← AL;DI ← DI + 1 / 2
(4)串比较指令 格式一:CMPS src,dst 格式二:CMPSB 格式三:CMPSW 功能:(DS:SI) - (ES:DI);SI←SI + 1 / 2;DI ← DI + 1 / 2
(5)串扫描指令 格式一:SCAS dst 格式二:SCASB 格式三:SCASW 功能:AL/AX-(ES:DI);DI ← DI + 1 / 2 说明:指令STD、CLD用于设置方向标志。STD使DF为1,CLD使DF为0。
(2)重复前缀指令 基本串操作指令完成一个数据的操作,如果要操作一组数据,就需要在基本串操作指令前加上重复前缀。 重复前缀指明该指令的基本操作是否被重复、重复的条件是什么。 基本操作的重复次数隐含在寄存器CX中。
(1)无条件重复前缀指令 格式:REP 功能:REP前缀加在串指令MOVS、STOS之前,控制串指令重复执行。串指令重复执行的次数保存在寄存器CX中。每执行一次串指令,CX←(CX)-1,直到CX=0为止。
(2)相等重复前缀指令 格式一:REPE 格式二:REPZ 功能:REPZ或REPE前缀加在串指令CMPS、SCAS指令前,控制串指令重复执行。当(CX)≠0且ZF=1时,串指令重复执行;当(CX)=0或ZF=0时,串指令重复执行结束。
(3)不相等重复前缀REPNE或REPNZ 功能:REPNZ或REPNE前缀加在串指令CMPS、SCAS指令前,控制串指令重复执行。当(CX)≠0且ZF=0时,串指令重复执行;当(CX)=0或ZF=1时,串指令重复执行结束。 说明:带前缀的串操作指令执行后,CX -1操作不影响标志位。
【例3-7】 编写汇编程序段,把自SAREA开始的100个字复制到DAREA开始的区域中。 DATA1 SEGMENT SAREA DW …… DATA1 ENDS DATA2 SEGMENT DAREA DW …… DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2
(1)源、目标区没有重叠 MOV AX,SEG SAREA ; MOV DS,AX ;源区段地址送段寄存器DS MOV AX,SEG DAREA MOV ES,AX ;目标区段地址送段寄存器DS LEA SI,SAREA ;源区首字的偏移地址送SI LEA DI,DAREA ;目标区首字的偏移地址送DI MOV CX,100 ;串长送寄存器CX CLD ;DF=0,地址增 REP MOVSW ;串传送
(2)源、目标区有重叠 MOV CX,100 ;串长送寄存器CX MOV AX,SEG SAREA MOV DS,AX ;源区段地址送DS MOV AX,SEG DAREA MOV ES,AX ;目标区段地址送ES LEA SI,SAREA ADD SI,CX ;源区末字的偏移地址送SI LEA DI,DAREA ADD DI,CX ;目标区末字的偏移地址送DI STD ;DF=1,地址减 REP MOVSW ;串传送
【例3-8】 编写汇编程序段,将内存DS:2100~DS:210F存储区清0。 MOV ES,DS ;目标段段地址送ES MOV DI,2100 ;目标段首字节偏移地址送DI MOV CX,10H ;串长送寄存器CX CLD ;设置方向增 MOV AL,0 REP STOSB ;重复串送存
5. 控制转移指令 8086程序的执行顺序由代码段寄存器CS和指令指针寄存器IP的值决定。 程序可以按顺序执行,也可以根据情况改变程序的执行顺序。 控制转移指令就是通过改变CS和IP的值来实现程序的转移。
控制转移指令根据程序转移地址的不同,分为段内转移和段间转移。 段内转移是指程序在同一代码段内转移,这时只要改变IP的值。 段间转移指程序将转移到其他段,此时CS和IP的值同时改变。
(1)无条件转移指令 无条件转移指令执行后,程序无条件转移到段内由指令中给出的目标地址处。 A.段内直接转移指令 格式一:JMP 标号 指令完成的操作:IP←(IP)+以标号或立即数给出的偏移量,(CS)不变。
例如: JMP 2010H ;IP←2010H JMP SHORT L ;IP←(IP)+8位移量 JMP NEAR NEXT ;IP←(IP)+16位移量
B.段内间接转移指令 格式一:JMP 寄存器 格式二:JMP 存储单元 指令完成的操作:(IP)←寄存器或存储单元的值,(CS)不变。 例如: JMP BX ;IP←(BX) JMP WORD PTR [SI] ;IP←(DS:SI)
C.段间直接转移 格式:JMP FAR PTR标号 指令完成的操作:(IP)←标号所在存储单元的偏移地址,(CS)←标号所在存储单元的段地址。 例如: JMP FAR PTR NEXT ;(IP)←标号NEXT的偏移地址 ;(CS)←标号NEXT的段地址
D.段间间接转移 格式:JMP DWORD PTR 存储单元 指令完成的操作:(IP)←标号指出的双字存储单元的低16位,(CS)←标号给出的双字存储单元的高16位。 例如: JMP DWORD PTR [SI] ;IP←(DS:SI),CS←(DS:SI+2)
(2)条件转移指令 格式:Jcc 标号 功能:以标志位的状态作为转移依据。如果满足转移条件,则转移到标号指示的指令处;否则,顺序执行下一条指令。 说明: cc代表跳转条件,short-label表明该指令只能实现段内短转移,参数形式通常为符号地址。
条件转移指令(1) 操作符 功能 测试条件 JC 进位标志为1转移 CF=1 JNC 进位标志为0转移 CF=0 JZ/JE 等于0/相等转移 ZF=1 JNZ/JNE 不等于0/不相等转移 ZF=0 JS 符号标志为1转移 SF=1 JNS 符号标志为0转移 SF=0 JO 溢出转移 OF=1 JNO 无溢出转移 OF=0 JP/JPE 偶状态转移 PF=1 JNP/JPO 奇状态转移 PF=0 JCXZ CX=0转移 CX=0
条件转移指令(2) 比较情况 无符号数 有符号数 指令 判断条件 指令 判断条件 A>B JA ZF=0,CF=0 JG SF=OF JNBE JNLE 且 ZF=0 A>=B JAE ZF=1或 JGE SF=OF JNB CF=0 JNL 或ZF=1 A<B JB ZF=0,CF=1 JL SF<>OF JNAE JNGE 且ZF=0 A<=B JBE ZF=1或 JLE SF<>OF JNA CF=1 JNG 或ZF=1
二分支程序设计示例 【例3.9】把有符号字节数X和Y 的较大者送入变量Z。 ;字节变量X和Y比较程序段: …… MOV AL, X ;AL=X CMP AL, Y ;AL(即X)和Y比较 JGE YG ;X>=Y,转YG MOV AL, Y ;X<Y,AL=Y YG: MOV Z, AL ;较大者存放到Z单元
多分支程序设计示例 【例3.10】 求X字节变量数据的符号函数(3分支)。 ;求字节变量符号函数程序段(X=0,AL=0;X>0,AL=1;X<0,AL=-1) MOV AL, X CMP AL, 0 ; X与0比较 JZ ZERO ;为0,转ZERO JS NEGA ;为负,转NEGA MOV AL, 1 ;为正,AL= 1 JMP OK ;转公共出口OK ZERO: MOV AL, 0 ;AL= 0 NEGA: MOV AL, 0FFH ;AL= -1 OK: MOV Y, AL ;符号函数值存放到Y单元
(3)循环控制指令 循环控制指令用于控制程序重复执行。 循环控制指令提供了程序段循环的控制及手段。 循环控制指令都用CX寄存器作为循环次数计算器,表示某程序段的最大循环次数,且循环体每执行一次,CX被减去1。 8088/8086 CPU规定:被循环的程序段必须在同一段内,且长度不能大于256字节。 循环控制指令不影响标志位。
循环指令 格式:指令码 标号; (CX中存放循环次数) 操作符 操 作 功 能 LOOP CX<--(CX)-1 循环 若(CX)<>0,则循环 LOOPZ CX<--(CX)-1 当CX不为零且 LOOPE 若(CX)<>0且ZF=1,则循环 相等时循环 LOOPNZ CX<--(CX)-1 当CX不为零且 LOOPNE 若(CX)<>0且ZF=0,则循环 不相等时循环
A.循环指令 格式:LOOP 目标地址 功能: ① CX ← CX - 1 ② 如果CX = 0,结束循环,执行后续语句;否则: ③ 转移到标号处,循环体被重复。
B.相等循环指令 格式:LOOPZ/LOOPE 目标地址 功能: ① CX ← CX - 1 ② 如果CX = 0或ZF= 0,结束循环,执行后续语句;否则: ③ 转移到标号处,循环体被重复。
C.不相等循环指令 格式:LOOPNZ/LOONE 目标地址 功能: ① CX ← CX - 1 ② 如果CX =0或ZF=1,结束循环,执行后续语句;否则: ③ 转移到标号处,循环体被重复。
【例3-11】 在首地址为Array的存储区域已存入长度为M的字数组,编写汇编程序段,统计该数组中0元素的个数,统计结果存入Result单元。 MOV CX,M MOV Result,0 MOV SI,0 AGAIN: MOV AX,Array[SI] CMP AX,0 JNZ NEXT INC Result NEXT: ADD SI,2 LOOP AGAIN ;进入下一轮循环
LOOP AGAIN等效于下列语句: DEC CX JNZ AGAIN 但是,LOOP指令中完成CX←CX-1的操作不影响标志位,而DEC指令则对标志位有影响。
循环程序设计 【例3.12】 把存储器中N个字节数据“搬家”。 ;“搬家”程序段: MOV AX, DATA MOV DS, AX ;设置DS数据段基址 LEA SI, BLKS LEA DI, BLKD MOV CX, N ;CX=N LOP1: MOV AL, [SI] ;取一个数 MOV [DI], AL ;“搬”一个数 INC SI INC DI ;SI和DI分别做+1修改 LOOP LOP1 ;CX1≠0 ,循环 “搬”数
循环程序设计 【例3.13】 计算 SUM=a1b1+ a2b2 …… + a10b10 。 ;内存数据定义 ;计算SUM程序段 a db 89, 5, 56, 80 …… ; 10个数据 b db 18, 29, 12, 38 …… ; 10个数据 sum dw ? ;计算SUM程序段 …… mov dx, 0 mov si, 0 mov cx,10 lop1: mov al, a[si] mul b[si] add dx, ax inc si loop lop1 mov sum, dx
循环程序设计 【例3.14】 ARR数据区有N个有符号字节数(ARR数组)。求ARR数组的最大值、最小值、数组元素之和,以及数据平均值。 ARR db 89,-90,56,88 …… n equ $-ARR ; n=数据个数 max db -128 ; 预先放最小值-128 min db 127 ; 预先放最大值127 sum dw 0 ; 预先放求和初值0 ping db ? ; 平均值 ;程序段 …… LEA BX, ARR MOV CX, n pp1: MOV AL, [BX] CBW ADD sum, AX CMP max, AL JGE p1 MOV max, AL p1: CMP min,AL JLE p2 MOV min,AL p2: INC BX LOOP pp1 MOV AX, sum MOV CL, n IDIV CL ;al=平均值 MOV ping, AL ……
(4).过程调用与返回指令 需要反复被调用的具有一定功能的程序段可以被设计成过程(也称为子程序),以供需要时调用。在过程中需要安排返回指令,使得过程结束时,返回到调用处。 过程与调用程序在同一段内,称“段内调用”;过程与调用程序不在同一段内,称“段间调用”。 过程调用指令CALL和返回指令RET均不影响标志位,但影响堆栈内容。
A.过程调用指令 段内直接调用指令 格式:CALL 过程名 指令完成的操作: ① (SP)←(SP)-2; ② (SS:SP)←(IP); ③ (IP)←(IP)+16位偏移量。
段内间接调用指令 格式:CALL 寄存器 指令完成的操作: ① (SP)←(SP)-2; ② (SS:SP)←(IP); ③ (IP)←寄存器的值。
段间直接调用指令 格式:CALL FAR PTR 过程名 指令完成的操作: ① (SP)←(SP)-2; ② (SS:SP)←(CS); ③ (SP)←(SP)-2; ④ (SS:SP)←(IP); ⑤ (IP)←过程入口偏移地址; ⑥ (CS)←过程入口段地址。
段间间接调用指令 格式:CALL DWORD PTR 存储单元地址 指令完成的操作: ① (SP)←(SP)-2; ② (SS:SP)←(CS); ③ (SP)←(SP)-2; ④ (SS:SP)←(IP); ⑤ (IP)←双字存储单元低16位数据; ⑥ (CS)←双字存储单元高16位数据。
B.过程返回指令 无参数段内返回 格式:RET 指令完成的操作: ① (IP)←(SS:SP); ② (SP)←(SP)+2。
RET 子程序返回指令 格式 功能 操作 RET 段内返回 IP<--((SP)+1,(SP)) SP<--(SP)+2 格式 功能 操作 RET 段内返回 IP<--((SP)+1,(SP)) SP<--(SP)+2 RET 段间返回 IP<--((SP)+1,(SP)) CS<--((SP)+1,(SP)) RET EXP 带立即数返回 在上述操作之后再做 SP<--(SP)+EXP
有参数段内返回 格式:RET n 指令完成的操作: ① (IP)←(SS:SP); ② (SP)←(SP)+2+n。
无参数段间返回 格式:RET 指令完成的操作: ① (IP)←(SS:SP); ② (SP)←(SP)+2。 ③ (CS)←(SS:SP); ④ (SP)←(SP)+2。
有参数段间返回 格式:RET 指令完成的操作: ① (IP)←(SS:SP); ② (SP)←(SP)+2。 ③ (CS)←(SS:SP); ④ (SP)←(SP)+2+n。
(5)中断指令 中断是输入/输出程序设计中常用的控制方式,是指计算机暂时停止当前正在执行的程序而转去执行处理某事件的中断服务程序。 当中断服务程序执行完后,再恢复执行被暂时停止的程序。
常用的软件中断 中断号 功 能 10H 视频服务中断 13H 软硬盘控制中断 14H 串行口中断 15H 各种IO设备中断 16H 键盘中断 功 能 10H 视频服务中断 13H 软硬盘控制中断 14H 串行口中断 15H 各种IO设备中断 16H 键盘中断 17H 并行打印口中断 20H 返回DOS 21H DOS功能调用 23H Ctrl+Break处理 24H DOS严重错误 33H 鼠标中断 2FH 31H DOS保护方式接口 BIOS、DOS、自由中断的汇编调用方式: INT n ; n为中断向量号,如 INT 10H、INT 21H
常用的DOS系统功能调用 功能号 功能 入口参数 出口参数 01H 键盘输入 (AH)=1 (AL)=输入字符 02H 显示器输出 (AH)=2 无 (DL)=欲输出字符 09H 显示字符串 (AH)=9 无 (DS:DX)=字符串首址 字符串以‘$’结束 0AH 输入字符串 (AH)= 0AH (DS:DX)所指 (DS:DX)=输入缓 缓冲区中为 冲区首址 输入的字符串 4CH 返回调用 (AH)=4CH 无 进程
(1)中断指令 格式:INT n 功能:产生一个类型为n的软中断。 指令完成的操作: ① 标志寄存器入栈; ② 断点地址入栈,CS先入栈,然后IP入栈; ③ 从中断向量表中获取中断服务程序入口地址,即: IP← ( 0:4n+1,0:4n) CS← ( 0:4n+3,0:4n+2)
(2)溢出中断指令INTO 格式:INTO 功能:检测OF标志位。当OF=1时,产生中断类型为4的中断;当OF=0时,不起作用。 指令完成的操作(当产生中断类型为4的中断时): ① 标志寄存器入栈; ② 断点地址入栈,CS先入栈,然后IP入栈; ③ 从中断向量表中获取中断服务程序入口地址,即: IP ← ( 0:13,0:12) CS ← ( 0:15,0:14)
(3)中断返回指令IRET 格式:IRET 功能:从中断服务程序返回断点处,并将标志寄存器的值从堆栈弹出,继续执行原程序。本指令用于中断服务程序中。 指令完成的操作: ① 断点出栈:IP先出栈,CS后出栈; ② 标志寄存器出栈。
子程序调用和返回指令 ◆过程调用指令CALL 格式: CALL <过程名> 操作:先把返回地址(IP或IP和CS )压入堆栈,再转 向被调过程(子程序)。 ◆过程返回指令RET 格式: RET 操作:从堆栈中弹出返回地址(IP或IP和CS),转回 调用过程(主程序) 。 标志位:不改变任何标志位。
I/O中断指令 ◆ 中断指令INT 格式: INT n ; n为中断类型号0~255(0~0FFH) ◆ 系统提供的常用的 I/O中断指令: 显示BIOS 中断服务(INT 10H 指令) 键盘BIOS中断服务(INT 16H 指令) DOS中断服务(INT 21H 指令) INT 21H (AH=1) 键盘读一个字符到AL中,并回显 INT 21H (AH=2) 显示DL中的一个字符 INT 21H (AH=9) 显示由DS:DX指向的终止于‘$’的字符串 INT 21H (AH=0AH)键盘读一个字符串到DS:DX指向的字符缓冲区
常用I/O中断功能调用例 读字符给AL, 且回显: MOV AH,1 INT 21H 显示DL的字符: MOV DL,’A’ MOV AH,2 INT 21H 显示字符串: SUM DB ‘ABch6y$’ MOV DX,OFFSET SUM MOV AH,9 INT 21H 读字符串: SUM DB 20,?, 20 DUP (?) MOV DX,OFFSET SUM MOV AH,0AH INT 21H