微机原理-第8章汇编语言程序设计.ppt
- 文档编号:16138385
- 上传时间:2023-07-10
- 格式:PPT
- 页数:145
- 大小:3.43MB
微机原理-第8章汇编语言程序设计.ppt
《微机原理-第8章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《微机原理-第8章汇编语言程序设计.ppt(145页珍藏版)》请在冰点文库上搜索。
微型计算机机原理及应用,程序设计的基本技术,1,2,3,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,注意:
本书有关汇编语言程序设计只限于DOS环境下的实地址方式,该方式下字长为16位。
顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致,1顺序程序设计,格式:
MULsourceIMULsource;符号整数乘法,1.1乘除法指令,1.乘法指令MUL和符号整数乘法指令IMUL,1、源操作数source可以是字节、字或双字,可为寄存器或存储器操作数,不能为立即数。
2、目的操作数是隐藏的,为被乘数,放于AL、AX或EAX,视source的类型属性决定是AL、AX还是EAX3、在乘法指令之前必须将目的操作数送AL(字节乘)或AX(字乘)或EAX(双字乘)。
乘积的放法:
8位或16位乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示,AL,sourc8,AX,AX,sourc16,AX,DX,1.1乘除法指令,32位乘法指令所执行的操作是EAX乘以source,乘积放回到EDX和EAX,如下图所示,EAX,sourc32,EAX,EDX,注意:
乘法指令对标志位CF和OF有影响,对其余标志位的影响不确定。
1.1乘除法指令,例如:
将AX中的3位BCD数转换为二进制数存入字节变量SB中。
M0VCH,10MOVCL,4MOVSB,AL;暂存十位和个位MOVAL,AH;百位存入AL中MULCH;百位10AXMOVAH,SB;百位10的积小于255,所以只用AL存放即可SHRAH,CL;取十位ADDAL,AH;百位10+十位ALMULCH;(百位10+十位)10AXANDSB,0FH;取个位ADDSB,AL;(百位10+十位)10+个位SB,N2102N110N0(N210N1)10N0,程序段如下:
1.1乘除法指令,格式:
IMULREG,source;REGREGXsourceIMULREG,source,imm;REGsourceXimm,1.1乘除法指令,注:
符号整数乘法指令IMUL,1、双操作数乘法指令是用源操作数乘目的操作数,乘积存入目的操作数。
2、三操作数乘法指令是用源操作数乘立即数,乘积存入目的操作数。
3、要求:
其源操作数source可为寄存器或存储器操作数,目的操作数只能是16位和32位的寄存器,源、目的操作数的类型要求一致。
格式:
DIVsourceIDIVsource;符号整数除法注意:
源操作数source可以是字、字节或双字,可为REG或MEM,不能为立即数目的操作数是隐藏的,放置被除数,可为AX或DX和AX或EDX和EAX。
2.除法指令DIV和符号整数除法指令IDIV,1.1乘除法指令,8位或16位除法指令所执行的操作如下图所示,AL,sourc8,AX,AX,sourc16,AH,DX,1.1乘除法指令,32位除法指令所执行的操作如下图所示,EAX,sourc32,EDX,可用除法运算(除10取余)将二进制数转换为BCD数,1.1乘除法指令,如,用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如下图所示,1.1乘除法指令,方法:
“除10取余”法,例如将AL中的8位无符号二进制数转换为BCD数放入AX中,例如将AL中的8位无符号二进制数转换为BCD数放入AX中,MOVAL,0FFHMOVCL,10MOVAH,0;将8位二进制数扩展为16位DIVCL;商AL,余数AH(个位数)MOVCH,AH;暂存BCD数个位MOVAH,0DIVCL;商AL,余数AH(十位数)MOVCL,4SHLAH,CL;BCD数十位移至高4位ORCH,AH;BCD数十位与个位拼合MOVAH,0MOVCL,10DIVCL;AH中余数为BCD数的百位MOVAL,CH;BCD数十位与个位送AL,1.1乘除法指令,3.扩展指令CBW和CWD,扩展方法:
要把一个8位二进制数除以另一个8位二进制数,要有一个16位二进制数在AX中,所以做8位除以8位的除法前先要把8位被除数扩展为16位。
做16位除以16位的除法前要把16位被除数扩展为32位,做32位除以32位的除法前要把32位被除数扩展为64位。
这种扩展对于无符号数除法只需将AH或DX或EDX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。
1.1乘除法指令,指令都隐含操作数在做8位除以8位、16位除以16位、32位除以32位的符号整数除法之前,应先扩展AL或AX或EAX中的被除数。
扩展指令和符号整数除法指令仅对补码数适用。
格式:
CBW;AL的最高位符号位扩展至AHCWD;AX的最高位扩展至DXCWDE;AX的最高位扩展至EAX的高16位CDQ;EAX的最高位扩展至EDX,1.1乘除法指令,如:
有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为:
MOVSI,OFFSETARRAYMOVAX,SICWDIDIVWORDPTR2SIMOV4SI,AXMOV6SI,DX,1.1乘除法指令,1.2BCD数调整指令,分析:
两个BCD数相加,其和仍应为BCD数,如不是BCD数则结果错误。
(正确)BCD数十进制数码加法器的和(错误)0000000001001910010001,00001010100001,01011511110001,0110160001,00000010,0101250001,1001如何修正?
1.2BCD数调整指令,造成此结果的原因?
产生错误的原因是8421BCD码为十进制,逢十进一,而四位二进制是逢十六进一,二者进位关系不同,当和数大于9时,8421BCD应产生进位,而十六进制还不可能产生进位。
为此,应对结果进行修正。
当运算结果小于等于9时,不需修正或加“0”,但当结果大于9时,应修正让其产生一个进位,加0110即可。
如相加结果产生了进位位,其结果必定大于9,所以,也需修正。
对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果。
1.BCD数加法调整指令DAA和AAA,格式:
DAA功能:
将AL中的数当作两个压缩BCD数相加之和调整为正确的压缩BCD数。
调整规则:
(AL0FH)9或AF=1,则AL加6;(AL0F0H)90H或CF=1,则AL加60H.,1.2BCD数调整指令,
(1)压缩BCD数加法调整,注意:
该指令操作数隐含为AL,即只能对AL中的操作数据进行调整。
导致压缩BCD数的加减指令只能针对字节运算。
对结果调整时要用到CF和AF两个标志位,所以调整指令应紧跟BCD数加法指令DAA指令会影响标志如:
MOVAX,3456HADDAL,AH;AL8AH,AF0,CF0DAA;AL90H,1.2BCD数调整指令,例1求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。
如:
8931+5678=14609,程序段如下:
W1DW8931HW2DW5678HSUMDB3DUP(0)MOVAL,BYTEPTRW1;AL31HADDAL,BYTEPTRW2;31+78=A9H,ALA9H,CF=0,AF=0DAA;AL09H,CF=1MOVSUM,AL;存个位和十位MOVAL,BYTEPTRW1+1;AL89HADCAL,BYTEPTRW2+1;89+56+CF=ALE0H,CF=0,AF=1DAA;AL46H,CF=1MOVSUM+1,AL;存百位和千位MOVSUM+2,0;处理向万位的进位RCLSUM+2,1,1.2BCD数调整指令,格式:
AAA功能:
将AL中的数当作两个非压缩BCD数相加之和进行调整,得到正确的非压缩BCD数送AX。
调整规则:
(AL0FH)9或AF=1,则(AL+6)0FHAL,AH+1AH;否则,AL0FHAL,AH不变.,
(2)非压缩BCD数加法调整,1.2BCD数调整指令,注意:
同DAA指令,AAA指令的操作数也隐含为AL,且要紧跟加法指令。
导致非压缩BCD数的加减指令只能针对字节运算。
AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中,故执行该指令前应注意AH是否清0。
如:
将两个BCD数的ASCII码相加,得到和的ASCII码:
MOVAL,35H;5ADDAL,39H;9,AL=6EHMOVAH,0AAA;AX=0104HORAX,3030H;AX=3134H即14,1.2BCD数调整指令,例2求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。
如:
89+67=156,程序段如下:
W1DW0809HW2DW0607HSUMDB3DUP(0)MOVAX,W1;AX0809HADDAL,BYTEPTRW2;AL10H,AF=1AAA;AX0906HMOVSUM,AL;存个位MOVAL,AHADDAL,BYTEPTRW2+1;AL0FH,AF=0MOVAH,0AAA;AL05H,AH=01HMOVWORDPTRSUM+1,AX;存十位和百位,1.2BCD数调整指令,格式:
DAS功能:
将AL中的数当作两个压缩BCD数相减之差进行调整,得到正确的压缩BCD数。
调整规则:
(AL0FH)9或AF=1,则AL减6;(AL0F0H)90H或CF=1,则AL减60H.,如:
MOVAX,5643HSUBAL,AH;AL=DEH,有借位DAS;AL=78H,保持借位,即134-56,2.BCD数减法调整指令DAS和AAS,
(1)压缩BCD数减法调整,1.2BCD数调整指令,格式:
AAS功能:
将AL中的数当作两个非压缩BCD数相减之差进行调整,得到正确的非压缩BCD数送AX。
调整规则:
(AL0FH)9或AF=1,则(AL-6)0FHAL,AH-1AH;否则,AL0FHAL,AH不变.,如:
MOVAX,0806HSUBAL,07H;AX=08FFHAAS;AX=0709H,
(2)非压缩BCD数减法调整,1.2BCD数调整指令,格式:
AAM功能:
将AL中小于64H的二进制数变换为非压缩BCD数送AX调整规则:
AL/0AHAH(十位),ALMOD0AHAL(个位),如:
MOVAL,63HAAM;AX=0909H,3.非压缩BCD数乘除法调整指令AAM和AAD,
(1)乘法调整,1.2BCD数调整指令,例3字变量W和字节变量B分别存放着两个非压缩BCD数,编写求两数之积,并将它存储到JJ字节变量中的程序。
程序段如下:
WDW0307HBDB9JJDB3DUP(0)MOVAL,BYTEPTRW;AL=07HMULB;AX=003FHAAM;AX=0603HMOVWORDPTRJJ,AXMOVAL,BYTEPTRW+1;AL=03HMULB;AX=001BHAAM;AX=0207HADDAL,JJ+1;07H+06H=0DH,即AL=0DHAAA;进位直接加入AH!
AX=0303HMOVWORDPTRJJ+1,AX,1.2BCD数调整指令,格式:
AAD功能:
将AX中的两位非压缩BCD数变换成二进制数集中放在AL中。
如:
MOVAX,0906HMOVDL,06HAAD;AX=0060HDIVDL;AL=10H,AH=0MOVDL,AH;存余数AAM;AX=0106H,
(2)除法调整,注:
此指令可对被除数进行预调整加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行,1.2BCD数调整指令,例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数编程求二者的商和余数,并分别存放到字变量QUOT和字节变量REMA中。
程序段如下:
WDW0909HBDB5REMADB0QUOTDW0MOVAX,WAAD;0909H63HDIVB;63H5=13H4,AL=13H,AH=04HMOVREMA,AHAAM;13H0109HMOVQUOT,AX,1.2BCD数调整指令,例5从键盘键入09的任一自然数N,求其立方值并将其送显示器显示.,INPUTDBPleaseInputN(09):
LFBDB0182764DB125216343512729NDB0MOVDX,OFFSETINPUTMOVAH,9INT21H,可用乘法运算实现,也可用查表法实现。
查表法程序段如下:
1.3顺序程序设计举例,MOVAH,1;输入并显示器显示N,N送入ALINT21HMOVN,ALMOVAH,2;2号系统功能调用-换行MOVDL,0AHINT21HMOVDL,NANDDL,0FH;将N转换为N(将ASCII码转换为数字)MOVCL,2;将N乘以4SHLDL,CLMOVDH,0;8位4N扩展为16位的地址偏移量ADDDX,OFFSETLFB;4N+表的偏移地址MOVAH,9INT21H,1.3顺序程序设计举例,例6编写两个32位无符号数的乘法程序程序如下:
.386stacksegmentstackUSE16stackdw32dup(0)stackendsdatasegmentUSE16ABDD12345678HCDDD12233445HABCDDD2DUP(0)dataendscodesegmentUSE16startprocfarassumess:
stack,cs:
code,ds:
data,1.3顺序程序设计举例,pushdssubax,axpushaxmovax,datamovds,axMOVEAX,ABMULCDMOVABCD,EAXMOVABCD+4,EDXretstartendpcodeendsendstart,1.3顺序程序设计举例,程序设计的基本技术,1,3,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,2,顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的。
常用改变标志指令和转移指令实现分支。
分类:
JMP、JCOND两类。
转移指令将控制程序转向其后的目的标号指定的地址。
条件转移指令紧跟在能改变并设置状态的指令之后,由状态标志决定程序的走向。
2分支程序设计,通用格式:
Jcondshort_lable操作:
若满足条件,则OFFSETshort_lableIP,实现转移;否则顺序执行.short_lable短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128127(从本指令则为-126+129,因为条件转移指令均为双字节指令),故只能实现段内转移.80386以后,在实地址方式下,能够转移到代码段的任何位置。
2.1条件转移指令,仅判断一个标志位实现转移.,1.简单条件转移指令,2.1条件转移指令,如:
JZ/JES_LAB为零/相等转移操作:
测试前面操作结果为0则转移,即判ZF=1转移.JZ,JE为等价助记符,任写一种均可,可根据程序设计意图选择.如:
MOVBX,0FFFFHINCBX;ZF=1JZNEXT;为0转移到NEXTNEXT:
2.1条件转移指令,如:
MOVBL,1;CMPBL,5;ZF=0JENEXT;比较结果相等则转移到NEXT;不相等顺序执行NEXT:
注意:
此类指令,均只测试前面的操作结果所设标志,指令本身不影响标志.所以,在条件转移指令前,一定有一条能正确影响标志的指令.,2.1条件转移指令,2.无符号数条件转移指令,条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确.,如:
0FFH00H?
视为无符号数0FFH=25500H;视为符号数0FFH=-100H.所以,应将两种类型的数分开比较:
对无符号数使用术语:
低于/高于Below/Above;对带符号数使用术语:
小于/大于Less/Greater,2.1条件转移指令,无符号数条件转移指令有4条(P93,表32):
指令助记符功能JB/JNAE低于/不高于等于转移JNB/JAE不低于/高于等于转移JA/JNBE高于/不低于等于转移JNA/JBE不高于/低于等于转移,2.1条件转移指令,3.符号数条件转移指令,有符号数条件转移指令有4条(P94,表33):
指令助记符功能JL/JNGE小于/不大于等于转移JNL/JGE不小于/大于等于转移JG/JNLE大于/不小于等于转移JNG/JLE不大于/小于等于转移,2.1条件转移指令,格式:
JMPtarget操作:
将控制转向目的标号target:
target在段内:
target的偏移地址IPtarget在段外:
target的偏移地址IPtarget的段首址CS,条件转移范围为-128+127,而无条件转移指令没有范围限制.在分支程序中往往需要它将各分支重新汇集到一起.如何实现条件转移指令的范围?
2.2无条件转移指令,1.无条件直接转移指令,格式:
JMPdest操作:
转移的目的地址放于寄存器或存储器。
目的操作数为寄存器寄存器内容送IP目的操作数为字变量字变量内容送IP目的操作数为双字变量双字变量内容送CS和IP如:
JMPNEXT;无条件转移转到NEXTNEXT:
如:
JMPWORDPTRBX;即(BX)IP,2.无条件间接转移指令,2.2无条件转移指令,注意:
分支实现的基本方法有两种:
一种是利用比较转移指令实现分支;一种是利用跳转表实现分支.视比较对象,正确选择合适的转移指令.要为每个分支安排正确出口.凡是可共用的部分,应尽量放在公共程序段中以使程序简短.在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试.,2.3分支程序设计举例,例7编程计算下面函数值(X,Y均为字节符号数),思路:
1、如何确定X、Y是同号、异号数?
利用XORX,Y的结果来确定。
若同号,则异或的结果必为0;若异号,则异或的结果必为1。
2、如何确定X、Y是正数或负数?
利用CMP指令,比较X,Y,与0的大小来确定。
2.3分支程序设计举例,例7编程计算下面函数值(X,Y均为字节符号数),XDB-5YDB20ZDB0,MOVAL,XXORAL,Y;根据X、Y的符号置S标志,相同为0JSDIFF;符号位S=1转移,相异为1,X、Y相异结束MOVZ,1;Z赋1CMPX,0;相同后,判断其中某数的符号JNSNOCHA;大于等于0,结束NEGZ;小于0,求补得1NOCHA:
RETDIFF:
MOVZ,0RET,2.3分支程序设计举例,例8从键盘上键入09中任一自然数N,将2的N次方值在显示器的下一行显示出来。
思路:
1、计算2N的方法:
1左移N位,得到的结果为二进制数。
2、求得的徝是一个二进制数,为了输出还要将二进制数转换为十进制数BCD数码,将二进制数转化为BCD数,采用“除10取余法”,为了使用9号系统功能调用,还需将BCD数码的ASCII码存入内存,余数为BCD数,余数加上30H即可得到余数的ASCII码。
3、2的N次方值对应的列表在存储器中的放法,其最大值是2的9次方,29=512,最大值的ASCII码占3个单元,再加上回车、换行和$,所以输出数据区OBUF最多6个单元。
除10操作一直进行到商等于0为止本例中的最大商值为51(=33H),故可以采用16位除以8位的除法操作。
2.3分支程序设计举例,例8从键盘上键入09中任一自然数N,将2的N次方值在显示器的下一行显示出来。
程序段如下:
OBUFDB6DUP(0)MOVAH,1键盘键入的数的ASCII码送至ALINT21HANDAL,0FH;将N转换为NMOVCL,ALMOVAX,1;1X2NSHLAX,CLMOVBX,5MOVOBUFBX,$MOVCX,10;转换为十进制数的ASCII码,2.3分支程序设计举例,2.3分支程序设计举例,MOVCX,10;转换为十进制数的ASCII码AGAIN:
MOVDX,0DIVCXORDL,30HDECBXMOVOBUFBX,DL;将转换结果“2”的ASCII码存入ANDAX,AX;判断转换是否结束JNZAGAINSUBBX,2MOVWORDPTROBUFBX,0A0DH;存入回车换行MOVDX,BXADDDX,OFFSETOBUFMOVAH,9INT21HRET,例9从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。
思路:
1、键入的二位十六进制数码,采用10号系统功能调用,输入并存好。
(存的是ASCII码)2、键入数码假设为56,则存入AX中,AX=3635H,且AH=36H,AL=35H,3、如何将56的ASCII码转换为数码并合并到一个字节中去。
注意:
0-9和A-F的ASCII码转换为数码的方法是不同的。
2.3分支程序设计举例,例9从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。
IBUFDB3,0,3DUP(0)SBDB0MOVDX,OFFSETIBUF;键入2位十六进制数MOVAH,10INT21HMOVAX,WORDPTRIBUF+2;键入字符送AXSUBAX,3030H;字符变为十六进制数CMPAL,0AHJBLNSUB7SUBAL,7LNSUB7:
CMPAH,0AHJBLNSUB7SUBAH,7,2.3分支程序设计举例,HNSUB7:
MOVCL,4;将AX中的数拼合成一个字节SHLAL,CLORAL,AHMOVSB,ALRET,2.3分支程序设计举例,例10某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现:
一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支;另一种是跳转表法,直接实现多分支.,2.3分支程序设计举例,2.3分支程序设计举例,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:
128127,要求:
分支不能太多。
INPUTDBInput(07):
$MOVDX,OFFSETINPUT;显示提示MOVAH,9INT21HMOVAH,1;等待键入一个字符INT21HCMPAL,0;为0字符则转P0JEP0CMPAL,1;为1字符则转P1JEP1,2.3分支程序设计举例,CMPAL,2JEP2CMPAL,3JEP3CMPAL,4JEP4CMPAL,5JEP5CMPAL,6JEP6CMPAL,7JEP7RET;不是07则退出程序,2.3分支程序设计举例,P0:
MOVDL,0;键入0则显示0以替代P0程序JMPEXITP1:
MOVDL,1;键入1则显示1以替代P1程序JMPEXITP7:
MOVDL,7JMPEXITEXIT:
MOVAH,2INT21HRET;分支程序一定要注意汇合到结束处,2.3分支程序设计举例,方法二:
跳转表法利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处)在数据区造一地址表,存放不同的分支入口地址;设表的首地址为PTAB,每一个PTABP0入口地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 汇编语言 程序设计