微机原理-第8章汇编语言程序设计.ppt

上传人:b****9 文档编号:939532 上传时间:2022-10-14 格式:PPT 页数:145 大小:3.43MB
下载 相关 举报
微机原理-第8章汇编语言程序设计.ppt_第1页
第1页 / 共145页
微机原理-第8章汇编语言程序设计.ppt_第2页
第2页 / 共145页
微机原理-第8章汇编语言程序设计.ppt_第3页
第3页 / 共145页
微机原理-第8章汇编语言程序设计.ppt_第4页
第4页 / 共145页
微机原理-第8章汇编语言程序设计.ppt_第5页
第5页 / 共145页
点击查看更多>>
下载资源
资源描述

微机原理-第8章汇编语言程序设计.ppt

《微机原理-第8章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《微机原理-第8章汇编语言程序设计.ppt(145页珍藏版)》请在冰豆网上搜索。

微机原理-第8章汇编语言程序设计.ppt

微型计算机机原理及应用,程序设计的基本技术,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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1