微机原理-第8章汇编语言程序设计PPT格式课件下载.ppt
《微机原理-第8章汇编语言程序设计PPT格式课件下载.ppt》由会员分享,可在线阅读,更多相关《微机原理-第8章汇编语言程序设计PPT格式课件下载.ppt(145页珍藏版)》请在冰豆网上搜索。
![微机原理-第8章汇编语言程序设计PPT格式课件下载.ppt](https://file1.bdocx.com/fileroot1/2022-10/4/a0afb785-8288-454e-8fde-69ebd8987812/a0afb785-8288-454e-8fde-69ebd89878121.gif)
百位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