第2章8086的指令系统三.ppt
第 2 章 8086的指令系统,(三),2,2.4 控制转移类指令,控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令重点掌握:JMP/Jcc/LOOP CALL/RETINT n/IRET 常用系统功能调用一般了解:LOOPZ/LOOPNZ INTO,控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,3,2.4.1 无条件转移指令,只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行指令操作数label是要转移到的目标地址(目的地址、转移地址),JMP label;程序转向label标号指定的地址,4,目标地址的范围:段内,段内转移近转移(near)在当前代码段64KB范围内转移(-3276832767)不需要更改CS段地址,只要改变IP偏移地址段内转移短转移(short)转移范围可以用一个字节表达,在段内128127范围的转移,5,目标地址的范围:段间,段间转移远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址,代码段,代码段,实际编程时,MASM汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制,6,JMP指令分成4种类型:段内转移、相对寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址,7,段内转移、相对寻址,JMP label;IPIP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负again:dec cx;标号again的指令jmp again;转移到again处继续执行jmp output;转向outputoutput:mov result,al;标号output的指令,8,段内转移、间接寻址,JMP r16/m16;IPr16/m16将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容jmp ax;IPAXjmp word ptr 2000h;IP2000h,9,段间转移、直接寻址,JMP far ptr label;IPlabel的偏移地址;CSlabel的段地址将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmp far ptr otherseg;远转移到代码段2的otherseg,10,段间转移、间接寻址,JMP far ptr mem;IPmem,CSmem+2用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器mov word ptr bx,0mov word ptr bx+2,1500hJMP far ptr bx;转移到1500h:0,11,Jmp转移指令的原理,可参见:王爽第九章,12,2.4.2 条件转移指令,指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令操作数label是采用相对寻址方式的短转移标号表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移距当前IP地址128127个单元的范围之内,Jcc label;条件满足,发生转移:IPIP8位位移量;条件不满足,顺序执行,13,Jcc指令的分类,Jcc指令不影响标志,但要利用标志。根据利用的标志位不同,16条指令分成3种情况:1.判断单个标志位状态 2.比较无符号数高低 3.比较有符号数大小,14,转移条件cc:单个标志状态,JZ/JEZF=1Jump if Zero/EqualJNZ/JNEZF=0Jump if Not Zero/Not EqualJSSF=1Jump if SignJNSSF=0Jump if Not SignJP/JPEPF=1Jump if Parity/Parity EvenJNP/JPOPF=0Jump if Not Parity/Parity OddJOOF=1Jump if OverflowJNOOF=0Jump if Not OverflowJCCF=1Jump if CarryJNCCF=0Jump if Not Carry,采用多个助记符,只是为了方便记忆和使用,15,转移条件cc:两数大小关系,无符号数JB/JNAECF=1Jump if Below/Not Above or EqualJNB/JAECF=0Jump if Not Below/Above or EqualJBE/JNACF=1或ZF=1Jump if Below/Not AboveJNBE/JACF=0且ZF=0Jump if Not Below or Equal/Above,16,SF=0 SF=0 SF=1 SF=1 OF=0 OF=1 OF=0 OF=1 正,=溢出,负,=,带符号数JL/JNGESFOFJump if Less/Not Greater or EqualJNL/JGESF=OFJump if Not Less/Greater or EqualJLE/JNGSFOF或ZF=1Jump if Less or Equal/Not GreaterJNLE/JGSF=OF且ZF=0Jump if Not Less or Equal/Greater,17,判断单个标志位状态,这组指令单独判断5个状态标志之一JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)JS和JNS:利用符号标志SF,判断结果是正是负JO和JNO:利用溢出标志OF,判断结果是否产生溢出JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位,例题2.38,例题2.39,例题2.40,例题2.41,例题2.42,18,例2.38:JZ/JNZ指令,test al,80h;测试最高位jz next0;D70(ZF1),转移mov ah,0ffh;D71,顺序执行jmp done;无条件转向next0:mov ah,0done:.,test al,80h;测试最高位jnz next1;D71(ZF0),转移mov ah,0;D70,顺序执行jmp done;无条件转向next1:mov ah,0ffhdone:.,19,例2.39:JS/JNS指令,;计算|XY|(绝对值);X和Y为存放于X单元和Y单元的16位操作数;结果存入resultmov ax,Xsub ax,Yjns nonnegneg ax;neg是求补指令nonneg:mov result,ax,20,例2.40:JO/JNO指令,;计算XY;X和Y为存放于X单元和Y单元的16位操作数;若溢出,则转移到overflow处理mov ax,Xsub ax,Yjo overflow.;无溢出,结果正确overflow:.;有溢出处理,21,例2.41:JP/JNP指令,;设字符的ASCII码在AL寄存器中;将字符加上奇校验位;在字符ASCII码中为“1”的个数已为奇数时;则令其最高位为“0”;否则令最高位为“1”and al,7fh;最高位置“0”,同时判断“1”的个数jnp next;个数已为奇数,则转向nextor al,80h;否则,最高位置“1”next:.,22,例2.42:JC/JNC指令,;记录BX中1的个数xor al,al;AL0,CF0again:test bx,0ffffh;等价于 cmp bx,0je nextshl bx,1jnc againinc aljmp againnext:.;AL保存1的个数,另一种做法,23,记录BX中“1”的个数,xor al,al;AL0,CF0again:cmp bx,0jz nextshl bx,1;也可使用 shr bx,1adc al,0jmp againnext:.;AL保存1的个数,24,比较无符号数高低,无符号数的大小用高(Above)低(Below)表示利用CF确定高低、利用ZF标志确定相等(Equal)两数的高低分成4种关系:低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA),25,例2.43a:比较无符号数,cmp ax,bx;比较ax和bxjnb next;若axbx,转移xchg ax,bx;若axbx,交换next:.,结果:AX保存较大的无符号数,26,比较有符号数大小,有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)两数的大小分成4种关系:小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG),27,例2.43b:比较有符号数,cmp ax,bx;比较ax和bxjnl next;若axbx,转移xchg ax,bx;若axbx,交换next:.,结果:AX保存较大的有符号数,28,2.4.3 循环指令(loop),循环指令默认利用CX计数器label操作数采用相对短转移寻址方式,LOOP label;CXCX1,;CX0,循环到标号label,LOOPZ label;CXCX1,;CX0且ZF1,循环到标号label,LOOPNZ label;CXCX1,;CX0且ZF0,循环到标号label,JCXZ label;CX0,转移到标号label,29,例2.44:记录空格个数,mov cx,count;设置循环次数,即字符数mov si,offset stringxor bx,bx;bx0,记录空格数jcxz done;如果长度为0,退出mov al,20hagain:cmp al,es:sijnz next;ZF0非空格,转移inc bx;ZF=1是空格,个数加1next:inc siloop again;字符个数减1,不为0继续循环,30,2.4.4 子程序指令,子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行,演示,31,主程序与子程序,CALL label,主程序,RET,子程序,回到CALL指令后的指令处返回地址,32,子程序调用指令,CALL指令分成4种类型(类似JMP)CALL label;段内调用、相对寻址CALL r16/m16;段内调用、间接寻址CALL far ptr label;段间调用、直接寻址CALL far ptr mem;段间调用、间接寻址CALL指令需要保存返回地址:段内调用入栈偏移地址IPSPSP2,SS:SPIP段间调用入栈偏移地址IP和段地址CSSPSP2,SS:SPIPSPSP2,SS:SPCS,33,子程序返回指令,根据段内和段间、有无参数,分成4种类型RET;无参数段内返回RET i16;有参数段内返回RET;无参数段间返回RET i16;有参数段间返回需要弹出CALL指令压入堆栈的返回地址段内返回出栈偏移地址IPIPSS:SP,SPSP2段间返回出栈偏移地址IP和段地址CSIPSS:SP,SPSP2CSSS:SP,SPSP2,i16参数的作用,34,返回指令RET的参数,RET i16;有参数返回RET指令可以带有一个立即数i16,则堆栈指针SP将增加,即SPSP+i16这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数,35,例2.45:子程序,;主程序mov al,0fh;提供参数ALcall htoasc;调用子程序.;子程序:将AL低4位的一位16进制数转换成ASCII码htoasc:and al,0fh;只取al的低4位or al,30h;al高4位变成3cmp al,39h;是09,还是0Ah0Fhjbe htoendadd al,7;是0Ah0Fh,加上7htoend:ret;子程序返回,36,2.4.5 中断指令,中断(Interrupt)是又一种改变程序执行顺序的方法中断具有多种中断类型中断的指令有3条:INT i8 IRET INTO本节主要掌握类似子程序调用指令的中断调用指令INT i8,进而学习使用DOS功能调用,37,中断的过程,主程序,IRET,中断服务程序,断点,中断请求,中断请求可以来自处理器外部的中断源,也可以由处理器执行指令引起:例如执行INT i8指令。,38,8086的外部中断,8086可以管理256个中断各种中断用一个向量编号来区别主要分成外部中断和内部中断外部中断来自CPU之外的原因引起的中断,又可以分成可屏蔽中断:可由CPU的中断允许标志IF控制非屏蔽中断:不受CPU的中断允许标志IF控制,39,8086的内部中断,内部中断CPU内部执行程序引起的中断,又可以分成:除法错中断:执行除法指令,结果溢出产生的 0 号中断指令中断:执行中断调用指令INT i8产生的 i8 号中断断点中断:用于断点调试(INT 3)的 3 号中断溢出中断:执行溢出中断指令,OF1产生的 4 号中断单步中断:TF1在每条指令执行后产生的 1 号中断,40,中断指令INT,INT i8;中断调用指令:产生i8号中断IRET;中断返回指令:实现中断返回INTO;溢出中断指令:;若溢出标志OF=1,产生4号中断;否则顺序执行,41,2.4.6 系统功能调用,21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能ROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序汇编语言程序设计需要采用系统的各种功能程序充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握,42,43,功能调用的步骤,通常按照如下4个步骤进行:在AH寄存器中设置系统功能调用号 在指定寄存器中设置入口参数 执行指令INT 21H(或ROM-BIOS的中断向量号)实现中断服务程序的功能调用 根据出口参数分析功能调用执行情况,44,输入输出类功能调用,向显示器输出字符 字符的输出 字符串的输出从键盘输入数据 字符的输入 字符串的输入 按键的判断,45,字符输出的功能调用,DOS功能调用INT 21H功能号:AH02H入口参数:DL字符的ASCII码功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出,46,例2.46:显示问号,;在当前显示器光标位置显示一个问号mov ah,02h;设置功能号:ah02hmov dl,?;提供入口参数:dl?int 21h;DOS功能调用:显示,进行字符输出时,当输出响铃字符(07H)以及退格(08H)、回车(0DH)和换行(0AH)字符时,该功能调用可以自动识别并能进行相应处理,47,字符输出的功能调用,显示器功能调用INT 10H功能号:AH0EH入口参数:AL字符的ASCII码 BL字符的颜色值(图形方式)BH页号(字符方式)通常使BX0功能:将字符按原属性在光标处显示,光标自动移到下一个字符位置,48,字符串输出的功能调用,DOS功能调用INT 21H功能号:AH09H入口参数:DS:DX欲显示字符串在主存中的首地址 字符串应以$(24H)结束功能:在显示器输出指定的字符串可以输出回车(0DH)和换行(0AH)字符产生回车和换行的作用,49,例2.47:显示字符串,string db Hello,Everybody!,0dh,0ah,$;在数据段定义要显示的字符串.mov ah,09h;设置功能号:ah09hmov dx,offset string;提供入口参数:dx字符串的偏移地址int 21h;DOS功能调用:显示,50,字符输入的功能调用,DOS功能调用INT 21H功能号:AH01H出口参数:AL字符的ASCII码功能:获得按键的ASCII代码值调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值,51,例2.48:判断按键,getkey:mov ah,01h;功能号:ah01hint 21h;功能调用cmp al,Y;处理出口参数alje yeskey;是“Y”cmp al,Nje nokey;是“N”jne getkey.yeskey:.nokey:.,52,字符输入的功能调用,键盘功能调用INT 16H功能号:AH0出口参数:AX键值代码对于标准ASCII码按键:ALASCII码,AH扫描码;对于扩展按键:AL00H,AH键扩展码;对于alt小键盘数字按键:ALASCII码,AH00H此功能类同DOS功能01H,会一直等待按键,53,例2.49:字符输入输出,mov ah,0;键盘功能调用(int 16h)int 16h;al按键的ASCII码mov bx,0;显示功能调用(int 10h)mov ah,0ehint 10h;显示,54,字符串输入的功能调用,DOS功能调用INT 21H功能号:AH0AH入口参数:DS:DX缓冲区首地址执行该功能调用时,用户按键,最后用回车确认本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按CtrlBreak或CtrlC则中止,关键要定义好缓冲区,55,缓冲区的定义,第1字节事先填入最多欲接收的字符个数(包括回车字符,可以是1255)第2字节将存放实际输入的字符个数(不包括回车符)第3字节开始将存放输入的字符串实际输入的字符数多于定义数时,多出的字符丢掉,且响铃扩展ASCII码(如功能键等)占两个字节,第1个为0,56,例2.50:输入字符串,bufferdb 81;定义缓冲区;第1个字节填入可能输入的最大字符数db 0;存放实际输入的字符数db 81 dup(0);存放输入的字符串.mov dx,seg buffer;伪指令seg取得buffer的段地址mov ds,dx;设置数据段DSmov dx,offset buffermov ah,0ahint 21h,57,按键判断的功能调用,DOS功能调用INT 21H功能号:AH0BH出口参数:AL0,当前没有按键;ALFFH,当前已经按键。功能:仅判断当前是否有按下的键,设置AL后退出,58,例2.51:按任意键继续,.;提示“按任意键继续”getkey:mov ah,0bhint 21hor al,al;al0?jz getkey;al0,没有按键,继续等待,59,按键判断的功能调用,键盘功能调用INT 16H功能号:AH1出口参数:若标志ZF1,无键按下;若ZF0,有键按下,且AX键值代码功能:此子功能仅判断是否按键,设置零位标志ZF后退出这两个功能调用都不循环等待按键,即使有键按下,键盘缓冲区仍然保留键值并且没有被清空,必要时必须用字符输入功能取走键值清空缓冲区,60,教学提示,在学习和应用汇编语言进行程序设计时,有一些经常遇到的问题,例如算术运算、代码转换等,需要掌握,总结常见编程问题,