- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《第四章指令系统
第四章??8086指令系统
?
???? 难点和重点:寻址方式寻址方式是学习微型计算机原理的一个重要概念,要想使汇编语言程序编得好(既简短又灵活),必须掌握好微处理器指令系统中的各种寻址方式。要弄清每种寻址方式的寻址过程,并学会灵活、巧妙地应用这些寻址方式。8086/8088CPU的寻址方式十分丰富,为编程者提供了良好的条件。寻址方式十分重要,一定要以引起学生重视。并希望学生在学习8086/8088CPU指令系统之前,对寻址方式有个初步的认识和了解。
1.堆栈及堆栈操作
堆栈是用来存放断点地址和其它器存器内容的一组寄存器或存储单元。堆栈分硬件堆栈和软件堆栈两种。硬件堆栈由CPU内部一组寄存器组成,速度快,但数量有限;软件堆栈是在RAM中开辟一个区域作堆找,速度稍慢,但堆栈的深度不受限制。目前微处理器几乎都采用软件堆栈。堆栈操作有两种:压入和弹出。堆栈操作必须遵循后进先出的规则。这一功能是借助于堆栈指示器SP来实现的。SP用来存放栈顶地址,并具有自动步进加1和减1的功能。当堆栈采用向下生成方式时,找底占用较高地址,栈顶占月较低地址。这时,对压入栈操作,首先使SP减1指向栈顶空单元,然后压入信息。对弹出栈操作,首先将SP所指栈顶单元内容弹出,再使SP加l指向新的栈顶地址。与此相反,堆找操作还有向上生成方式。
2.? 溢出问题
如果进行加减运算的结果超出了数据范围,对无符号数则以CF=1来表示,而对带符号数则以OF=1来表示。在编程中应严格区分有符号数和无符号数的运算。
3.? 各种算术运算操作对标志位的影响
加法运算对于CF标志位的影响是:在相加时如果最高位有进位,则CF=1,否则 CF=0,而对于减法却是相减时有借位则CF=1。这是因为在8086微机中加减法运算时的操作数均采用补码的形式表示,所有的减法运算都转化为加法运算来完成,所以减法的借位运算在补码相加过程表现为:若相加时无进位,则表示相减有借位,此时CF=1;若相加时有进位,则表示相减时无借位,此时CF=0。如执行指令SBB [BP],A034H(其中[BP]=F4A2H,CF=l)过程如下:
?
?
?
F4A2H= 1111? 0100? 1010? 0010
[-A034H]补 =0101? 1111? 1100? 1100
????? [-1] 补 =1111? 1111?? 1111? 1111?????
0101? 0100? 0110? 1101
因为最高1+0+1向前有进位,所以C=0。
在使用INC DEC指令时应注意它们的运算结果不影响CF标志位,对其它标志位有影响
多字节(或字)的加减法8086指令系统不仅为实现8位或16位的加、减法提供相应的指令,而且为实现16位以上的多字节(或字)数相加减也提供了方便的指令。带进位加指令ADC和带借位减指令SBB就是专为实现多字节(或字)数加减而提供的指令。如:若有两个4字节的无符号数相加,这两个数分别存放在2000H和3000H开始的存储单元中,得到的和存放在2000H开始的内存单元中。
?MOV? DX ,[3000H]
?ADD? [2000H] ,DX
?MOV? DX , [3002H]
ADC? [2002H] , DX
XOR? AX , AX
DC?? [2004H] , AX
上面程序中的第一条ADD加法语句实现的就是低字相加,而第二条ADC加法语句实现的则是高字相加并加上第一个低字相加所产生的进位。按这种方法就可以完成任意多个字相加了。
另外在加减运算产生溢出时,该语句还可以扩展加减运算结果范围。如:从内存的2000H单元开始存放了500H个学生的成绩,要求出这些成绩的和,并将该和存放在500H开始的单元处(低位字节在先)。
MOV? BX , 2000H
XOR? AX , AX
MOV? DX , AX
CLC?
MOV? CX , 500H
Ll :? ADC? AX ,[BX]
ADC? DX , 0
INC?? BX
INC?? BX
?
?
L00P? LI
MOV? [500H], AX
MOV? [502H] ,? Dx
因500H名学生的成绩之和最大为128000,超出了一个字所能表示的最大范围,所以要用两个字来表示该累加和,每次相加都是从最低位(AX)加起,有进位才向高位(DX)进位。所以利用该指令可以将一条指令所能操作的数据的范围任意加以扩大,从而提高了运算精度。
4.BCD码调整指令
BCD码是用二进制表示的十进制数,而加、减、乘、除指令都是完成二进制的相应运算的,利用这些指令来完成BCD码的运算结果一定是错的,因此要对该结果进行一定的修正才能得到正确的运算值。在8086指令系统中设立了专门的这类指令。对于加法的修正指令分为DAA(适用于组合 B
文档评论(0)