您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第3章1微机原理,汇编与接口技术课件
1微机原理、汇编与接口技术2第三章程序设计的基本技术3.13.23.33.5顺序程序设计分支程序设计循环程序设计子程序设计3.4串处理程序设计3.6宏功能程序设计3宏汇编语言与程序设计1.包括4个内容:•宏汇编语言“(伪指令及运算符、表达式的定义和应用)•DOS调用方法(键盘输入和屏幕显示)•程序设计(设计方法及规范)•上级实践2.汇编语言•中级语言•面向机器的符号语言•程序代码短、运行速度快、实时性好、可直接控制硬件•是计算机本专业语言3.要求熟悉硬件环境和DOS系统4顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致3.1顺序程序设计5格式:MULsourceIMULsource;符号整数乘法3.1.1乘除法指令1.乘法指令MUL和符号整数乘法指令IMUL源操作数source可以是字节、字或双字,可为寄存器或存储器操作数,不能为立即数目的操作数是AL、AX或EAX,视source的类型属性决定是AL、AX还是EAX在乘法指令之前必须将目的操作数送AL(字节乘)或AX(字乘)或EAX(双字乘)616位乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示ALsourc8AX×AXsourc16AX×DX3.1.1乘除法指令732位乘法指令所执行的操作是EAX乘以source,乘积放回到EDX和EAX,如下图所示EAXsourc16EAX×EDX可用乘法运算将BCD数转换为二进制数3.1.1乘除法指令8例将AX中的3位BCD数转换为二进制数存入字节变量SB中M0VCH,10MOVCL,4MOVSB,AL;暂存十位和个位MOVAL,AH;百位存入AL中MULCH;百位×10→AXMOVAH,SBSHRAH,CL;取十位ADDAL,AH;百位×10+十位→ALMULCH;(百位×10+十位)×10→AXANDSB,0FH;取个位ADDSB,AL;(百位×10+十位)×10+个位→SBN2×102+N1×10+N0=(N2×10+N1)×10+N0程序段如下:9格式:DIVsourceIDIVsource;符号整数除法注:源操作数source可以是字、字节或双字,可为REG或MEM,不能为立即数目的操作数是AX或DX和AX或EDX和EAX2.除法指令DIV和符号整数除法指令IDIV3.1.1乘除法指令1016位除法指令所执行的操作如下图所示ALsourc8AXAXsourc16AXDXAHDX……3.1.1乘除法指令1132位除法指令所执行的操作如下图所示EAXsourc32EAXEDXEDX…可用除法运算(除10取余)将二进制数转换为BCD数3.1.1乘除法指令12例将AL中的8位无符号二进制数转换为BCD数放入AX中MOVAL,7DHMOVCL,4MOVBL,10MOVAH,0;将8位二进制数扩展为16位DIVBL;商→AL,余数→AH(个位数)MOVBH,AH;个位暂存MOVAH,0DIVBL;商→AL,余数→AH(十位数)SHLAH,CLORBH,AH;BCD数十位与个位合并MOVAH,0DIVBL;AH中余数为BCD数百位MOVAL,BH;BCD数十位与个位送AL“除10取余”法133.扩展指令CBW和CWD要把一个8位二进制数除以一个8位二进制数,要有一个16位二进制数在AX中.所以做8位除以8位的除法前先要把8位被除数扩展为16位,做16位除以16位的除法前要把16位被除数扩展为32位,做32位除以32位的除法前要把32位被除数扩展为64位.这种扩展对于无符号数除法只需将AH或DX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。3.1.1乘除法指令14两指令都隐含操作数在做8位除以8位、16位除以16位、32位除以32位的除法之前,应先扩展AL、AX或EAX中的被除数扩展指令和符号整数除法仅对补码数适用格式:CBW;AL的最高位扩展至AHCWD;AX的最高位扩展至DXCWDE;AX的最高位扩展至EAX的高16位CDQ;EAX的最高位扩展至EDX3.1.1乘除法指令15如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为:MOVSI,OFFSETARRAYMOVAX,[SI]CWDIDIVWORDPTR2[SI]MOV4[SI],AXMOV6[SI],DX3.1.1乘除法指令163.1.2BCD数调整指令用二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如:00000011B+00001001B=00001100B00001001B+00000111B=00010000B第一个结果是非BCD数;第二个结果是不正确的BCD数。若再加上6,就可以得到正确的BCD数:00001100B+00000110B=00010010B00010000B+00000110B=00010110B对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果171.BCD数加法调整指令DAA和AAA格式:DAA功能:将AL中的和调整为正确的压缩BCD数调整规则:(AL&0FH)9或AF=1,则AL加6;(AL&0F0H)90H或CF=1,则AL加60H.3.1.2BCD数调整指令(1)压缩BCD数加法调整18注:该指令操作数隐含为AL,即只能对AL中的操作数据调整对结果调整时要用到CF,AF标志,所以调整指令应紧跟BCD数加法指令DAA指令会影响标志如:MOVAX,3456HADDAL,AH;AL=8AH,AF=0,CF=0DAA;AL=90H00110100+0101011010001010+0110100100003.1.2BCD数调整指令19格式:AAA功能:将AL中的和调整为正确的非压缩BCD数送AX调整规则:(AL&0FH)9或AF=1,则(AL+6)&0FH→AL,AH+1→AH;否则,AL&0FH→AL,AH不变.(2)非压缩BCD数加法调整3.1.2BCD数调整指令20注:同DAA,AAA的操作数也隐含为AL,且要紧跟加法指令AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中.故执行该指令前AH应清0如:将两个BCD数的ASCII码相加,得到和的ASCII码:MOVAL,35H;’5’ADDAL,39H;’9’,AL=6EHMOVAH,0AAA;AX=0104HORAX,3030H;AX=3134H即’14’3.1.2BCD数调整指令21例3.1求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。如:8931+5678=14609W1DW8931HW2DW5678HSUMDB3DUP(0)MOVAL,BYTEPTRW1;AL=31HADDAL,BYTEPTRW2;AL=A9H,CF=0,AF=0DAA;AL=09H,CF=1MOVSUM,AL;存个位和十位MOVAL,BYTEPTRW1+1;AL=89HADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1DAA;AL=46H,CF=1MOVSUM+1,AL;存百位和千位MOVSUM+2,0;处理向万位的进位RCLSUM+2,122例3.2求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。如:89+67=156W1DW0809HW2DW0607HSUMDB3DUP(0)MOVAL,BYTEPTRW1;AL=09HADDAL,BYTEPTRW2;AL=10H,AF=1AAA;AL=06H,AH=01HMOVSUM,AL;存个位MOVAL,BYTEPTRW1+1;AL=08HADCAL,BYTEPTRW2+1;AL=0FH,AF=0MOVAH,0AAA;AL=05H,AH=01HMOVWORDPTRSUM+1,AX;存十位和百位23格式:DAS功能:将AL中的差调整为正确的压缩BCD数调整规则:(AL&0FH)9或AF=1,则AL减6;(AL&0F0H)90H或CF=1,则AL减60H.如:MOVAX,5643HSUBAL,AH;AL=DEH,有借位DAS;AL=78H,保持借位,即134-562.BCD数减法调整指令DAS和AAS(1)压缩BCD数减法调整3.1.2BCD数调整指令24格式:AAS功能:将AL中的差调整为正确的非压缩BCD数送AX调整规则:(AL&0FH)9或AF=1,则(AL-6)&0FH→AL,AH-1→AH;否则,AL&0FH→AL,AH不变.如:MOVAX,0806HSUBAL,07H;AX=08FFHAAS;AX=0709H(2)非压缩BCD数减法调整3.1.2BCD数调整指令25格式:AAM功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX调整规则:AL/0AH→AH(十位),ALMOD0AH→AL(个位)如:MOVAL,63HAAM;AX=0909H3.非压缩BCD数乘除法调整指令AAM和AAD(1)乘法调整3.1.2BCD数调整指令26格式:AAD功能:将AX中的两位非压缩BCD数变换成二进制数集中在AL中如:MOVAX,0906HMOVDL,06HAAD;AX=0060HDIVDL;AL=10H,AH=0MOVDL,AH;存余数AAM;AX=0106H(2)除法调整注:此指令可对被除数进行预调整加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行.3.1.2BCD数调整指令27例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数,求两者的商和余数,分别存入字变量Q和字节变量R中。分析:先将W中的非压缩BCD数取到AX中,用AAD指令调整为二进制数,二进制的除法之后,再用AAM指令将结果调整为非压缩BCD数。如,(W)=0909H,(B)=5,99÷5=19…4→(Q)=0109H,(R)=04H28WDW0909HBDB03HRDB0QDW0MOVAX,WAAD;0909H→63HDIVB;AL=13H,AH=04HMOVR,AH;存余数AAM;13H→0109HMOVQ,AX;存商29例3.5(教材P96)从键盘键入0~9的任一自然数N,求其立方值并显示.INPUTDB’PleaseInputN(0~9):$’LFBDB’0$1$8$27$64$125$’DB’216$343$512$729$’NDB0MOVDX,OFFSETINPUTMOVAH,9INT21H显示提示信息建立立方表方法:可用乘法运算实现,也可用查表法实现.3.1.3顺序程序设计举例30MOVAH,1INT21HMOVN,ALMOVAH,2MOVDL,0AHINT21HMOVDL,NANDDL,0FHMOVCL,2SHLDL,CLMOVDH,0ADDDX,OFFSETLFBMOVAH,9INT21HN×4→DX显示(LFB+4*N)单元的内容,直到$结束输出换行键入一个数→N31第三章程序设计的基本技术3.13.33.5顺序程序设计分支程序设计循环程序设计子程序设计3.4串处理程序设计3.6宏功能程序设计3.232顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的.常用改变标志指令和转移指令实现分支.3.2分支程序设计33通用格式:Jcondshort_lable操作:若满足条件,则OFFSETshort_lable→IP,实现转移;否则顺序执行.short_lable→短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128~127(从本指令则为-126~+129,因为条件转移指令均为双字节指令),故只能实现段内转移.3.2.1条件转移指令34仅判断一个标志位实现转移.参见教材:P93、表3-1PF=0奇转移JNP/JPOPF=1偶转移JP/JPEOF=0无溢出转移JNOOF=1溢出转移JOSF=0为正转移JNSSF=1为负转移JSCF=0无进(借)
本文标题:第3章1微机原理,汇编与接口技术课件
链接地址:https://www.777doc.com/doc-4006755 .html