版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教学提示在正确理解每条指令的功能基础上,可以阅读和编写有实际意义的程序段多多阅读程序段3.3位操作类指令位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握注意这些指令对标志位的影响1、逻辑运算指令ANDORXORNOTTEST2、移位指令SHLSHRSALSAR3、循环移位指令ROLRORRCLRCR逻辑与指令AND对两个操作数执行逻辑与运算,结果送到目的操作数AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义ANDreg,imm/reg/mem;reg←reg∧imm/reg/memANDmem,imm/reg;mem←mem∧imm/reg只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0AND逻辑或指令OR对两个操作数执行逻辑或运算,结果送到目的操作数OR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义ORreg,imm/reg/mem;reg←reg∨imm/reg/memORmem,imm/reg;mem←mem∨imm/reg只要相“或”的两位有一位是1,结果就是1;否则,结果为0OR逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送到目的操作数XOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义XORreg,imm/reg/mem;reg←reg⊕imm/reg/memXORmem,imm/reg;mem←mem⊕imm/reg只有相“异或”的两位不相同,结果才是1;否则,结果为0XOR逻辑非指令NOT对一个操作数执行逻辑非运算NOT指令是一个单操作数指令NOT指令不影响标志位NOTreg/mem;reg/mem←~reg/mem按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”NOT例题:逻辑运算moval,45h ;逻辑与al=01handal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;逻辑或al=75horal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;逻辑异或al=74hxoral,31h ;CF=OF=0,SF=0、ZF=0、PF=1moval,45h ;逻辑非al=0bahnotal ;标志不变例题:逻辑指令应用;AND指令可用于复位某些位(同0相与),不影响其他位.例:将BL中D3和D0位清0,其他位不变andbl,11110110B例:将AL中的字符‘8’转换成对应的数字8.moval,‘8’
andal,0fh;方法一subal,‘0’;方法二例题:逻辑指令应用;OR指令可用于置位某些位(同1相或),不影响其他位。例:将BL中D3和D0位置1,其他位不变orbl,00001001B;XOR指令可用于求反某些位(同1相异或),不影响其他位。例:将BL中D3和D0位求反,其他不变xorbl,00001001B测试指令TEST对两个操作数执行逻辑与运算,结果不回送到目的操作数AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义TESTreg,imm/reg/mem ;reg∧imm/reg/memTESTmem,imm/reg ;mem∧imm/reg只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0TEST例3.32:测试为0或1testal,01h
;测试AL的最低位D0jnzthere ;标志ZF=0,即D0=1 ;则程序转移到there... ;否则ZF=1,即D0=0,顺序执行there:...
TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况TEST思考:若要测试ax中的第8、10位是否同时位1,如何实现?第一步:将第8、10位翻转xorax,0500h第二步:测试第8、10位是否同时为0testax,0500h若结果为0则说明以上两位同时为1移位指令(shift)将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作SHLreg/mem,1/CL;逻辑左移,最高位进入CF,最低位补0SHRreg/mem,1/CL;逻辑右移,最低位进入CF,最高位补0SALreg/mem,1/CL;算术左移,最高位进入CF,最低位补0SARreg/mem,1/CL;算术右移,最低位进入CF,最高位不变SAL与SHL相同演示演示演示移位指令的操作数移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元后一个操作数表示移位位数(1)1,表示移动一位;(2)CL,移位位数大于1,用CL寄存器值表示移位指令对标志的影响按照移入的位设置进位标志CF根据移位后的结果影响SF、ZF、PF对AF没有定义如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定例3.33:移位指令movcl,4moval,0f0h ;al=f0hshlal,1 ;al=e0h;CF=1,SF=1、ZF=0、PF=0,OF=0shral,1 ;al=70h;CF=0,SF=0、ZF=0、PF=0、OF=1saral,1 ;al=38h;CF=0,SF=0、ZF=0、PF=0、OF=0saral,cl ;al=03h;CF=1,SF=0、ZF=0、PF=1分析下面每次移位后,AH、CF中的值各是多少?MOVAH,11HSHLAH,1MOVCL,2SHLAH,CL思考:左移一位相当于乘以几?例3.34:移位实现乘movsi,axshlsi,1 ;si←2×axaddsi,ax ;si←3×axmovdx,bxmovcl,03hshldx,cl ;dx←8×bxsubdx,bx ;dx←7×bxadddx,si ;dx←7×bx+3×ax逻辑左移一位相当于无符号数乘以2
逻辑右移一位相当于无符号数除以2循环移位指令(rotate)将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作ROLreg/mem,1/CL;不带进位循环左移RORreg/mem,1/CL;不带进位循环右移RCLreg/mem,1/CL;带进位循环左移RCRreg/mem,1/CL;带进位循环右移演示演示演示演示循环移位指令对标志的影响按照指令功能设置进位标志CF不影响SF、ZF、PF、AF如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定例3.35:32位数移位;将DX.AX中32位数值左移一位shlax,1rcldx,1DXAXCF0例3.36:位传送;把AL最低位送BL最低位,保持AL不变rorbl,1roral,1rclbl,1rolal,1AL、BLCFBLCFALCFAL之D0例3.37:BCD码合并;AH.AL分别存放着非压缩BCD码的两位;将它们合并成为一个压缩BCD码存ALandax,0f0fh ;保证高4位为0movcl,4rolah,cl ;也可以用shlah,claddal,ah ;也可以用oral,ah3.4控制转移类指令控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令重点掌握:JMP、Jcc、LOOP常用系统功能调用int21h一般了解:LOOPZ、LOOPNZ、INTO、CALL、RET、INTn、IRET
控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变3.4.1无条件转移指令JMP3.4.2条件转移指令JCC3.4.3循环指令LOOPJCXZ3.4.4~5子程序指令、中断指令(以后讲)3.4.6系统功能调用INT21H3.4.1无条件转移指令只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令操作数label是要转移到的目标地址(目的地址、转移地址)JMP指令分成4种类型:⑴段内转移、直接寻址(重点掌握)⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址JMPlabel ;程序转向label标号指定的地址JMP第2章目标地址的寻址方式直接寻址方式转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式间接寻址方式转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式第2章用标号表达用寄存器或存储器操作数表达JMP目标地址的范围:段内段内转移——近转移(near)在当前代码段64KB范围内转移(±32KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移——短转移(short)转移范围可以用一个字节表达,在段内-128~+127范围的转移代码段代码段第2章JMP目标地址的范围:段间段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址第2章代码段代码段
实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr
或farptr
强制JMPJMP段内转移、直接寻址JMPlabel ;IP←IP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负 jmpagain
;转移到again处继续执行
……again:
deccx
;标号again的指令
…… jmpoutput
;转向output
……output:
movresult,al
;标号output的指令第2章实际为相对寻址段内转移、间接寻址JMPr16/m16 ;IP←r16/m16将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容jmpax ;IP←AXjmpwordptr[2000h] ;IP←[2000h]
第2章JMPJMP段间转移、直接寻址JMPfarptrlabel ;IP←label的偏移地址 ;CS←label的段地址将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmpfarptrotherseg ;远转移到代码段2的otherseg第2章JMP段间转移、间接寻址JMPfarptrmem ;IP←[mem],CS←[mem+2]用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx];转移到1500h:0第2章JMP3.4.2条件转移指令指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令操作数label是采用短转移,称为相对寻址方式JccJcclabel;条件满足,发生转移:IP←IP+8位位移量;条件不满足,顺序执行第2章相对寻址方式Jcc指令的操作数label是一个标号一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移8位位移量是相对于当前IP的,且距当前IP地址-128~+127个单元的范围之内,属于段内短距离转移Jcc目标地址就采用这种相对寻址方式Jcc指令为2个字节,条件不满足时的顺序执行就是当前指令偏移指针IP加2JccJcc指令的分类Jcc指令不影响标志,但要利用标志(表3.2)。根据利用的标志位不同,16条指令分成3种情况:判断单个标志位状态(重点掌握一个,其它类似)3.
比较无符号数高低3.比较有符号数大小Jcc条件转移指令中的条件ccJcc实际虽然指令只有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/JNB/JAE:利用进位标志CF,判断结果是否进位或借位Jcc例题3.38例题3.39例题3.40例题3.41例题3.42例3.38:JZ/JNZ指令 testal,80h ;测试最高位
jznext0 ;D7=0(ZF=1),转移 movah,0ffh ;D7=1,顺序执行
jmpdone ;无条件转向next0: movah,0done: ... testal,80h ;测试最高位
jnznext1 ;D7=1(ZF=0),转移 movah,0 ;D7=0,顺序执行
jmpdone ;无条件转向next1: movah,0ffhdone: ...例3.39:JS/JNS指令;计算|X-Y|(绝对值);X和Y为存放于X单元和Y单元的16位操作数;结果存入result movax,X subax,Y
jnsnonneg negax ;neg是求补指令nonneg: movresult,ax源程序见:EX2_39.ASM并分析分支结构例3.40:JO/JNO指令;计算X-Y;;X和Y为存放于X单元和Y单元的16位操作数;若溢出,则转移到overflow处理 movax,X subax,Y
jooverflow ... ;无溢出,结果正确overflow: ... ;有溢出处理例3.41:JP/JNP指令;设字符的ASCII码在AL寄存器中;将字符加上奇校验位;在字符ASCII码中为“1”的个数已为奇数时;则令其最高位为“0”;否则令最高位为“1” andal,7fh ;最高位置“0”,同时判断“1”的个数
jnpnext ;个数已为奇数,则转向next oral,80h ;否则,最高位置“1”next: ...例3.42:JC/JNC指令;记录BX中1的个数源程序见ex2_43.asm
xoral,al ;AL=0,CF=0again: testbx,0ffffh;等价于cmpbx,0
jenext shlbx,1
jncagain incal jmpagainnext: ... ;AL保存1的个数另一种做法记录BX中“1”的个数
xoral,al ;AL=0,CF=0again: cmpbx,0
jznext shlbx,1 ;也可使用shrbx,1 adcal,0 jmpagainnext: ... ;AL保存1的个数在debug中改变bx的值,再运行,分析结果比较无符号数高低无符号数的大小用高(Above)低(Below)表示利用CF确定高低、利用ZF标志确定相等(Equal)两数的高低分成4种关系:⑴低于(不高于等于):JB(JNAE)⑵不低于(高于等于):JNB(JAE)⑶低于等于(不高于):JBE(JNA)⑷不低于等于(高于):JNBE(JA)Jcc(重点掌握)例3.43a:比较无符号数 cmpax,bx ;比较ax和bx
jnbnext ;若ax≥bx,转移 xchgax,bx ;若ax<bx,交换next: ...结果:AX保存较大的无符号数比较有符号数大小有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)两数的大小分成4种关系:⑴小于(不大于等于):JL(JNGE)⑵不小于(大于等于):JNL(JGE)⑶小于等于(不大于):JLE(JNG)⑷不小于等于(大于):JNLE(JG)Jcc(重点掌握)例3.43b:比较有符号数 cmpax,bx ;比较ax和bx
jnlnext ;若ax≥bx,转移 xchgax,bx ;若ax<bx,交换next: ...结果:AX保存较大的有符号数条件转移指令应用——
分支结构例:当dx的高4位全为0时,使ax=0;否则使ax=-1。(习题3.26(3))分析、画流程图、编程分析:dx于0f000h与,根据结果判断源程序见:xi2_26_3.asmtip:jmp指令的应用分支结构应用:比如,判断一个字符是否为小写字母、是否为0~9的数字.3.363.37…….code.startupmovdx,200fhtestdx,0f000hjzzeromovax,-1
jmpend1zero:movax,0
end1:.exit03.4.3循环指令(loop)循环指令默认利用CX计数器,方便实现计数循环的程序结构label操作数采用相对寻址方式LOOPlabel ;CX←CX-1,;CX≠0,循环到标号labelLOOPZlabel ;CX←CX-1,;CX≠0且ZF=1,循环到标号labelLOOPNZlabel ;CX←CX-1,;CX≠0且ZF=0,循环到标号labelJCXZlabel ;CX=0,转移到标号label(重点掌握)例3.44:记录空格个数;设待处理字符串存放在以string开始的存储区,长度为count.
movcx,count ;设置循环次数,count为字符串长度 movsi,offsetstring;用lea如何? xorbx,bx ;bx=0,记录空格数
jcxzdone;如果长度为0,退出 moval,20h ;空格字符的ascii码20hagain: cmpal,es:[si] jnznext ;ZF=0非空格,转移 incbx ;ZF=1是空格,个数加1next: incsi
loopagain
;字符个数减1,不为0继续循环done:movresult,bxdeccxjnzagaincmpcx,0jzdone源程序见:ex2_44.asm循环结构习题3.26(6)(7)(8)3.4.4子程序指令子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行演示(先了解,以后细讲)主程序与子程序CALLlabel主程序RET子程序回到CALL指令后的指令处——返回地址子程序调用指令CALL指令分成4种类型(类似JMP)CALLlabel ;段内调用、直接寻址CALLr16/m16 ;段内调用、间接寻址CALLfarptrlabel ;段间调用、直接寻址CALLfarptrmem ;段间调用、间接寻址CALL指令需要保存返回地址:段内调用——入栈偏移地址IPSP←SP-2,SS:[SP]←IP段间调用——入栈偏移地址IP和段地址CSSP←SP-2,SS:[SP]←IPSP←SP-2,SS:[SP]←CS第2章CALL子程序返回指令根据段内和段间、有无参数,分成4种类型RET ;无参数段内返回RETi16 ;有参数段内返回RET ;无参数段间返回RETi16 ;有参数段间返回需要弹出CALL指令压入堆栈的返回地址段内返回——出栈偏移地址IPIP←SS:[SP],SP←SP+2段间返回——出栈偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2i16参数的作用RET第2章返回指令RET的参数 RETi16
;有参数返回RET指令可以带有一个立即数i16,则堆栈指针SP将增加,即SP←SP+i16这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数例3.45:子程序;主程序
moval,0fh ;提供参数AL
callhtoasc ;调用子程序 ...;子程序:将AL低4位的一位16进制数转换成ASCII码htoasc: andal,0fh ;只取al的低4位 oral,30h ;al高4位变成3 cmpal,39h ;是0~9,还是0Ah~0Fh jbehtoend addal,7 ;是0Ah~0Fh,加上7htoend: ret
;子程序返回转换原理3.4.5中断指令中断(Interrupt)是又一种改变程序执行顺序的方法中断具有多种中断类型中断的指令有3条:INTi8IRETINTO本节主要掌握类似子程序调用指令的中断调用指令INTi8,进而学习使用DOS功能调用(先了解,以后细讲)中断的过程主程序IRET中断服务程序断点中断请求中断请求可以来自处理器外部的中断源,也可以由处理器执行指令引起:例如执行INTi8指令。8086的外部中断8086可以管理256个中断各种中断用一个向量编号来区别主要分成外部中断和内部中断外部中断——来自CPU之外的原因引起的中断,又可以分成可屏蔽中断:可由CPU的中断允许标志IF控制非屏蔽中断:不受CPU的中断允许标志IF控制8086的内部中断内部中断——CPU内部执行程序引起的中断,又可以分成:除法错中断:执行除法指令,结果溢出产生的0号中断指令中断:执行中断调用指令INTi8产生的i8号中断断点中断:用于断点调试(INT3)的3号中断溢出中断:执行溢出中断指令,OF=1产生的4号中断单步中断:TF=1在每条指令执行后产生的1号中断中断指令INTINTi8;中断调用指令:产生i8号中断IRET;中断返回指令:实现中断返回INTO;溢出中断指令:;若溢出标志OF=1,产生4号中断;否则顺序执行3.4.6系统功能调用21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能ROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序汇编语言程序设计需要采用系统的各种功能程序充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握(重点掌握)功能调用的步骤通常按照如下4个步骤进行:⑴在AH寄存器中设置系统功能调用号⑵在指定寄存器中设置入口参数⑶执行指令INT21H(或ROM-BIOS的中断向量号)实现中断服务程序的功能调用⑷根据出口参数分析功能调用执行情况输入输出类功能调用向显示器输出字符⒈字符的输出⒉字符串的输出从键盘输入数据⒊字符的输入⒋字符串的输入⒌ROMBIOS中断调用裸机ROM-BIOSDOS功能调用汇编语言程序第2章字符输出的功能调用DOS功能调用INT21H功能号:AH=02H入口参数:DL=字符的ASCII码功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出例3.46:显示问号;在当前显示器光标位置显示一个问号movah,02h ;设置功能号:ah←02hmovdl,'?' ;提供入口参数:dl←'?'int21h
;DOS功能调用:显示字符串输出的功能调用DOS功能调用INT21H功能号:AH=09H入口参数:DS:DX=欲显示字符串在主存中的首地址字符串应以$(24H)结束功能:在显示器输出指定的字符串可以输出回车(0DH)和换行(0AH)字符产生回车和换行的作用例3.47:显示字符串stringdb'Hello,Everybody!',0dh,0ah,'$';在数据段定义要显示的字符串 ... movah,09h
;设置功能号:ah←09h movdx,offsetstring
;提供入口参数:dx←字符串的偏移地址
int21h ;DOS功能调用:显示字符输入的功能调用DOS功能调用INT21H功能号:AH=01H出口参数:AL=字符的ASCII码功能:获得按键的ASCII代码值调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值例3.48:判断按键getkey: movah,01h ;功能号:ah←01h
int21h
;功能调用 cmpal,’Y’ ;处理出口参数al jeyeskey ;是“Y” cmpal,’N’ jenokey ;是“N” jmpgetkey;重新输入 ...yeskey: ...nokey: ...举例调试:输入一个字符,接着换行输出字符串输入的功能调用DOS功能调用INT21H功能号:AH=0AH入口参数:DS:DX=缓冲区首地址执行该功能调用时,用户按键,最后用回车确认本
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论