1、教学提示,在正确理解每条指令的功能基础上,可以阅读和编写有实际意义的程序段,多多阅读程序段,2.3 位操作类指令,位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握 注意这些指令对标志位的影响 1、逻辑运算指令 AND OR XOR NOT TEST 2、移位指令 SHL SHR SAR 3、循环移位指令 ROL ROR RCL RCR,逻辑与指令AND,对两个操作数执行逻辑与运算,结果送到目的操作数,AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,AND,逻辑
2、或指令OR,对两个操作数执行逻辑或运算,结果送到目的操作数,OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,OR,逻辑异或指令XOR,对两个操作数执行逻辑异或运算,结果送到目的操作数,XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“异或”的两位不相同,结果才是1;否则,结果为0,XOR,逻辑非指令NOT,对一个操作数执行逻辑非运算,NOT指令是一个单操作数指令 NOT指令不影响标志位,NOT reg/mem ;reg/memreg/mem,按位取反,原
3、来是“0”的位变为“1”;原来是“1”的位变为“0”,NOT,例题:逻辑运算,mov al,45h ;逻辑与 al=01h and al,31h ;CF=OF=0,SF=0、ZF=0、PF=0 mov al,45h ;逻辑或 al=75h or al,31h ;CF=OF=0,SF=0、ZF=0、PF=0 mov al,45h ;逻辑异或 al=74h xor al,31h ;CF=OF=0,SF=0、ZF=0、PF=1 mov al,45h ;逻辑非 al=0bah not al ;标志不变,例题:逻辑指令应用,;AND指令可用于复位某些位(同0相与),不影响其他位:将BL中D3和D0位清0
4、,其他位不变 and bl,11110110B ;OR指令可用于置位某些位(同1相或),不影响其他位:将BL中D3和D0位置1,其他位不变 or bl, 00001001B ;XOR指令可用于求反某些位(同1相异或),不影响其他位:将BL中D3和D0位求反,其他不变 xor bl, 00001001B,测试指令TEST,对两个操作数执行逻辑与运算,结果不回送到目的操作数,AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,TEST,例2.32:测试为0或1,test al,01h ;测试AL的最低
5、位D0 jnz there ;标志ZF=0,即D0=1;则程序转移到there . ;否则ZF=1,即D0=0,顺序执行 there: .,TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况,TEST,移位指令(shift),将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作,SHL reg/mem,1/CL ;逻辑左移,最高位进入CF,最低位补0,SHR reg/mem,1/CL ;逻辑右移,最低位进入CF,最高位补0,SAL reg/mem,1/CL ;算术左移,最高位进入CF,最低位补0,SAR reg/mem,1/CL ;算术右移,最低位进入CF
6、,最高位不变,SAL与SHL相同,演示,演示,演示,移位指令的操作数,移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元 后一个操作数表示移位位数,该操作数为1,表示移动一位;当移位位数大于1时,则用CL寄存器值表示,该操作数表达为CL,移位指令对标志的影响,按照移入的位设置进位标志CF 根据移位后的结果影响SF、ZF、PF 对AF没有定义 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定,例2.33:移位指令,mov cl,
7、4 mov al,0f0h ;al=f0h shl al,1 ;al=e0h ;CF=1,SF=1、ZF=0、PF=0,OF=0 shr al,1 ;al=70h ;CF=0,SF=0、ZF=0、PF=0、OF=1 sar al,1 ;al=38h ;CF=0,SF=0、ZF=0、PF=0、OF=0 sar al,cl ;al=03h ;CF=1,SF=0、ZF=0、PF=1,例2.34:移位实现乘,mov si,ax shl si,1 ;si2ax add si,ax ;si3ax mov dx,bx mov cl,03h shl dx,cl ;dx8bx sub dx,bx ;dx7bx
8、add dx,si ;dx7bx3ax,逻辑左移一位相当于无符号数乘以2逻辑右移一位相当于无符号数除以2,循环移位指令(rotate),将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作,ROL reg/mem,1/CL ;不带进位循环左移,ROR reg/mem,1/CL ;不带进位循环右移,RCL reg/mem,1/CL ;带进位循环左移,RCR reg/mem,1/CL ;带进位循环右移,演示,演示,演示,演示,循环移位指令对标志的影响,按照指令功能设置进位标志CF 不影响SF、ZF、PF、AF 如果进行一位移动,则按照操作数的最高符号位是否改变,
9、相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定,例2.35:32位数移位,;将DX.AX中32位数值左移一位 shl ax,1 rcl dx,1,例2.36:位传送,;把AL最低位送BL最低位,保持AL不变 ror bl,1ror al,1rcl bl,1rol al,1,AL之D0,例2.37:BCD码合并,;AH.AL分别存放着非压缩BCD码的两位 ;将它们合并成为一个压缩BCD码存AL and ax,0f0fh ;保证高4位为0 mov cl,4 rol ah,cl ;也可以用shl a
10、h,cl add al,ah ;也可以用or al,ah,2.4 控制转移类指令,控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令 重点掌握:JMP/Jcc/LOOP CALL/RET INT n/IRET 常用系统功能调用 一般了解: LOOPZ/LOOPNZ INTO,控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,2.4.1 无条件转移指令,只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令 操作数label是要转移到的目标地址(目的地址、转移地址) JMP指令分成4种类型: 段内转移、直接寻址 段内转
11、移、间接寻址 段间转移、直接寻址 段间转移、间接寻址,JMP label ;程序转向label标号指定的地址,JMP,目标地址的寻址方式,直接寻址方式 转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式 间接寻址方式 转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式,用标号表达,用寄存器或存储器操作数表达,JMP,目标地址的范围:段内,段内转移近转移(near) 在当前代码段64KB范围内转移( 32KB范围) 不需要更改CS段地址,只要改变IP偏移地址 段内转移短转移(short) 转移范围可以用一个字节表达,在段内128127范围的转移,JMP,目标地址的范围
12、:段间,段间转移远转移(far) 从当前代码段跳转到另一个代码段,可以在1MB范围 需要更改CS段地址和IP偏移地址 目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址,代码段,代码段,实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、near ptr 或far ptr 强制,JMP,JMP,段内转移、直接寻址,JMP label ;IPIP+位移量 位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移 当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负jmp again ;转移到ag
13、ain处继续执行 again: dec cx ;标号again的指令jmp output ;转向output output: mov result,al ;标号output的指令,实际为相对寻址,段内转移、间接寻址,JMP r16/m16 ;IPr16/m16 将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容 jmp ax ;IPAX jmp word ptr 2000h ;IP2000h,JMP,JMP,段间转移、直接寻址,JMP far ptr label;IPlabel的偏移地址;CSlabel的段地址 将标号所在段的段地址作为新的CS值,标号
14、在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行 jmp far ptr otherseg;远转移到代码段2的otherseg,JMP,段间转移、间接寻址,JMP far ptr mem;IPmem,CSmem+2 用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器 mov word ptr bx,0 mov word ptr bx+2,1500h JMP far ptr bx ;转移到1500h:0,JMP,2.4.2 条件转移指令,指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行
15、指令;条件不成立,则程序将顺序执行下一条指令 操作数label是采用短转移,称为相对寻址方式,Jcc,Jcc label;条件满足,发生转移:IPIP8位位移量;条件不满足,顺序执行,相对寻址方式,Jcc指令的操作数label是一个标号 一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移 8位位移量是相对于当前IP的,且距当前IP地址128127个单元的范围之内,属于段内短距离转移 Jcc目标地址就采用这种相对寻址方式 Jcc指令为2个字节,条件不满足时的顺序执行就是当前指令偏移指针IP加2,Jcc,Jcc指令的分类,Jcc指令不影响标志,但要利用标志(表2.
16、2)。根据利用的标志位不同,16条指令分成3种情况: 1. 判断单个标志位状态 2. 比较无符号数高低 3. 比较有符号数大小,Jcc,条件转移指令中的条件cc,Jcc,实际虽然指令只有16条,但却有30个助记符采用多个助记符,只是为了方便记忆和使用,1. 判断单个标志位状态,这组指令单独判断5个状态标志之一 JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等) JS和JNS:利用符号标志SF,判断结果是正是负 JO和JNO:利用溢出标志OF,判断结果是否产生溢出 JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇 JC/JB/JNAE和JNC/J
17、NB/JAE:利用进位标志CF,判断结果是否进位或借位,Jcc,例题2.38,例题2.39,例题2.40,例题2.41,例题2.42,例2.38:JZ/JNZ指令,test al,80h ;测试最高位jz next0 ;D70(ZF1),转移mov ah,0ffh ;D71,顺序执行jmp done ;无条件转向 next0: mov ah,0 done: .test al,80h ;测试最高位jnz next1 ;D71(ZF0),转移mov ah,0 ;D70,顺序执行jmp done ;无条件转向 next1: mov ah,0ffh done: .,例2.39:JS/JNS指令,;计算
18、|XY|(绝对值) ;X和Y为存放于X单元和Y单元的16位操作数 ;结果存入resultmov ax,Xsub ax,Yjns nonnegneg ax ;neg是求补指令 nonneg: mov result,ax,例2.40:JO/JNO指令,;计算XY; ;X和Y为存放于X单元和Y单元的16位操作数 ;若溢出,则转移到overflow处理mov ax,Xsub ax,Yjo overflow. ;无溢出,结果正确 overflow: . ;有溢出处理,例2.41:JP/JNP指令,;设字符的ASCII码在AL寄存器中 ;将字符加上奇校验位 ;在字符ASCII码中为“1”的个数已为奇数时
19、;则令其最高位为“0”;否则令最高位为“1”and al,7fh;最高位置“0”,同时判断“1”的个数jnp next;个数已为奇数,则转向nextor al,80h ;否则,最高位置“1” next: .,例2.42:JC/JNC指令,;记录BX中1的个数xor al,al ;AL0,CF0 again: test bx,0ffffh ;等价于 cmp bx,0je nextshl bx,1jnc againinc aljmp again next: . ;AL保存1的个数,另一种做法,记录BX中“1”的个数,xor al,al ;AL0,CF0 again: cmp bx,0jz next
20、shl bx,1 ;也可使用 shr bx,1adc al,0jmp again next: . ;AL保存1的个数,比较无符号数高低,无符号数的大小用高(Above)低(Below)表示 利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系: 低于(不高于等于):JB(JNAE) 不低于(高于等于):JNB(JAE) 低于等于(不高于):JBE(JNA) 不低于等于(高于):JNBE(JA ),Jcc,例2.43a:比较无符号数,cmp ax,bx ;比较ax和bxjnb next ;若axbx,转移xchg ax,bx ;若axbx,交换 next: .,结果:AX
21、保存较大的无符号数,比较有符号数大小,有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系: 小于(不大于等于):JL(JNGE) 不小于(大于等于):JNL(JGE) 小于等于(不大于):JLE(JNG) 不小于等于(大于):JNLE(JG ),Jcc,例2.43b:比较有符号数,cmp ax,bx ;比较ax和bxjnl next ;若axbx,转移xchg ax,bx ;若axbx,交换 next: .,结果:AX保存较大的有符号数,2.4.3 循环指令(loop),循环指令默认利用CX计数器,方便实现计数循环的
22、程序结构 label操作数采用相对寻址方式,LOOP label ;CXCX1,;CX0,循环到标号label,计数非零循环,LOOPZ label ;CXCX1,;CX0且ZF1,循环到标号label,LOOPNZ label ;CXCX1,;CX0且ZF0,循环到标号label,JCXZ label ;CX0,转移到标号label,例2.44:记录空格个数,mov cx,count ;设置循环次数mov si,offset stringxor bx,bx ;bx0,记录空格数jcxz done ;如果长度为0,退出mov al,20h ;空格的ASIC11码为20h again: cmp
23、al,es:sijnz next ;ZF0非空格,转移inc bx ;ZF=1是空格,个数加1 next: inc siloop again;字符个数减1,不为0继续循环,2.4.4 子程序指令,子程序是完成特定功能的一段程序 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行 当运行完子程序功能后,采用RET返回指令回到主程序继续执行,演示,子程序调用指令,CALL指令分成4种类型(类似JMP) CALL label ;段内调用、直接寻址 CALL r16/m16 ;段内调用、间接寻址 CALL far ptr label ;段间调用、直接寻址 CALL
24、far ptr mem ;段间调用、间接寻址 CALL指令需要保存返回地址: 段内调用入栈偏移地址IP SPSP2,SS:SPIP 段间调用入栈偏移地址IP和段地址CS SPSP2,SS:SP CS SPSP2,SS:SPIP,CALL,主程序与子程序,CALL label,主程序,RET,子程序,回到CALL指令后的指令处返回地址,子程序返回指令,根据段内和段间、有无参数,分成4种类型 RET ;无参数段内返回 RET i16 ;有参数段内返回 RET ;无参数段间返回 RET i16 ;有参数段间返回 需要弹出CALL指令压入堆栈的返回地址 段内返回出栈偏移地址IP IPSS:SP, SP
25、SP2 段间返回出栈偏移地址IP和段地址CS IPSS:SP,SPSP2 CSSS:SP,SPSP2,i16参数的作用,RET,返回指令RET的参数,RET i16 ;有参数返回 RET指令可以带有一个立即数i16, 则堆栈指针SP将增加,即 SPSP+i16 这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数,例2.45:子程序,;主程序mov al,0fh ;提供参数ALcall htoasc ;调用子程序. ;子程序:将AL低4位的一位16进制数转换成ASCII码 htoasc: and al,0fh ;只取al的低4位or al,30h ;al高4位变成3cmp al,3
26、9h ;是09,还是0Ah0Fhjbe htoendadd al,7 ;是0Ah0Fh,加上7 htoend: ret ;子程序返回,转换原理,2.4.5 中断指令,中断(Interrupt )是又一种改变程序执行顺序的方法 中断具有多种中断类型 中断的指令有3条: INT i8 IRET INTO 本节主要掌握类似子程序调用指令的中断调用指令INT i8,进而学习使用DOS功能调用,中断的过程,主程序,IRET,中断服务程序,断点,中断请求,中断请求可以来自处理器外部的中断源,也可以由处理器执行指令引起: 例如执行INT i8指令。,8086的外部中断,8086可以管理256个中断 各种中断
27、用一个向量编号来区别 主要分成外部中断和内部中断 外部中断来自CPU之外的原因引起的中断,又可以分成 可屏蔽中断:可由CPU的中断允许标志IF控制 非屏蔽中断:不受CPU的中断允许标志IF控制,8086的内部中断,内部中断CPU内部执行程序引起的中断,又可以分成: 除法错中断:执行除法指令,结果溢出产生的 0 号中断 指令中断:执行中断调用指令INT i8产生的 i8 号中断 断点中断:用于断点调试(INT 3)的 3 号中断 溢出中断:执行溢出中断指令,OF1产生的 4 号中断 单步中断:TF1在每条指令执行后产生的 1 号中断,中断指令INT,INT i8 ;中断调用指令:产生i8号中断
28、IRET ;中断返回指令:实现中断返回 INTO ;溢出中断指令: ;若溢出标志OF=1,产生4号中断 ;否则顺序执行,2.4.6 系统功能调用,21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能 ROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序 汇编语言程序设计需要采用系统的各种功能程序 充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握,功能调用的步骤,通常按照如下4个步骤进行: 在AH寄存器中设置系统功能调用号 在指定寄存器中设置入口参数 执行指令INT 21H(或R
29、OM-BIOS的中断向量号)实现中断服务程序的功能调用 根据出口参数分析功能调用执行情况,输入输出类功能调用,向显示器输出字符 字符的输出 字符串的输出 从键盘输入数据 字符的输入 字符串的输入 按键的判断,字符输出的功能调用,DOS功能调用INT 21H 功能号:AH02H 入口参数:DL字符的ASCII码 功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出,例2.46:显示问号,;在当前显示器光标位置显示一个问号 mov ah,02h ;设置功能号:ah02h mov dl,? ;提供入口参数:dl? int 21h ;DOS功能调
30、用:显示,进行字符输出时,当输出响铃字符(07H)以及退格(08H)、回车(0DH)和换行(0AH)字符时,该功能调用可以自动识别并能进行相应处理,字符输出的功能调用,显示器功能调用INT 10H 功能号:AH0EH 入口参数:AL字符的ASCII码 BL字符的颜色值(图形方式) BH页号(字符方式) 通常使BX0 功能:将字符按原属性在光标处显示,光标自动移到下一个字符位置,字符串输出的功能调用,DOS功能调用INT 21H 功能号:AH09H 入口参数: DS:DX欲显示字符串在主存中的首地址 字符串应以$(24H)结束 功能:在显示器输出指定的字符串 可以输出回车(0DH)和换行(0AH
31、)字符产生回车和换行的作用,例2.47:显示字符串,string db Hello,Everybody !,0dh,0ah,$ ;在数据段定义要显示的字符串.mov ah,09h;设置功能号:ah09hmov dx,offset string;提供入口参数:dx字符串的偏移地址int 21h;DOS功能调用:显示,字符(键盘)输入的功能调用,DOS功能调用INT 21H 功能号:AH01H 出口参数:AL字符的ASCII码 功能:获得按键的ASCII代码值 调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值,例2.48:判断按键,getkey: mov ah,01h ;功能号:ah
32、01hint 21h ;功能调用cmp al,Y ;处理出口参数alje yeskey ;是“Y”cmp al,Nje nokey ;是“N”jne getkey. yeskey: . nokey: .,字符输入的功能调用,键盘功能调用INT 16H 功能号:AH00(读取键值) 出口参数:AX键值代码 对于标准ASCII码按键:ALASCII码,AH扫描码; 对于扩展按键(组合键、F1F10功能键、光标控制键等):AL00H,AH键扩展码(0FH84H); 对于alt小键盘数字按键:ALASCII码,AH00H 此功能类同DOS功能01H,会一直等待按键,例2.49:字符输入输出,mov a
33、h,0 ;键盘功能调用(int 16h) int 16h ;al按键的ASCII码 mov bx,0 ;显示功能调用(int 10h) mov ah,0eh int 10h ;显示,字符串输入的功能调用,DOS功能调用INT 21H 功能号:AH0AH 入口参数:DS:DX缓冲区首地址 执行该功能调用时,用户按键,最后用回车确认 本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按CtrlBreak或CtrlC则中止,关键要定义好缓冲区,缓冲区的定义,第1字节事先填入最多欲接收的字符个数(包括回车字符,可以是1255) 第2字节将存放实际输入的字符个数(不包括回车符) 第3字节开始将存
34、放输入的字符串 实际输入的字符数多于定义数时,多出的字符丢掉,且响铃 扩展ASCII码(如功能键等)占两个字节,第1个为0,例2.50:输入字符串,buffer db 81 ;定义缓冲区 ;第1个字节填入可能输入的最大字符数db 0 ;存放实际输入的字符数db 81 dup(0) ;存放输入的字符串.mov dx,seg buffer;伪指令seg取得buffer的段地址mov ds,dx ;设置数据段DSmov dx,offset buffermov ah,0ahint 21h,按键判断的功能调用,DOS功能调用INT 21H 功能号:AH0BH 出口参数:AL0,当前没有按键;ALFFH,
35、当前已经按键。 功能:仅判断当前是否有按下的键,设置AL后退出,例2.51:按任意键继续,. ;提示“按任意键继续” getkey: mov ah,0bhint 21hor al,al ;al0?jz getkey;al0,没有按键,继续等待,按键判断的功能调用,键盘功能调用INT 16H 功能号:AH1 出口参数:若标志ZF1,无键按下; 若ZF0,有键按下,且AX键值代码 功能:此子功能仅判断是否按键,设置零位标志ZF后退出 这两个功能调用都不循环等待按键,即使有键按下,键盘缓冲区仍然保留键值并且没有被清空,必要时必须用字符输入功能取走键值清空缓冲区,第2章 教学要求(3),掌握基本指令:ANDORXORNOTTEST、SHLSHRSAR、ROLRORRCLRCR、 JMPJcc、JCXZLOOP、CALLRET、INT n 了解不常使用的指令: IRET、 LOOPZLOOPNZ、INTO 习题3(p69) 2.13 2.22 2.24 2.29 2.34,16位数转换为ASCII码,JMP指令:段内相对转移,JMP指令:段内寄存器间接转移,JMP指令:段内存储器间接转移,JMP指令:段间直接转移,JMP指令:段间间接转移,SHL / SAL指令,SHR指令,SAR指令,ROL指令,ROR指令,RCL指令,RCR指令,逻辑运算指令,课间休息,