- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
80X86汇编语言程序设计 第二章⑤.8086 8088指令系统(二)加减运算指令
80X86汇编语言程序设计
第二章 8086/8088寻址方式和指令系统
(二)加减运算指令
1.加法指令ADD
格式:ADD OPRD1,OPRD2
执行的操作:(OPRD1)←(OPRD1)+(OPRD2)
例如:MOV AX,7896H ;(AX)=7896H
即(AH)=78H (AL)=96H ;各标志位保持不变
ADD AL,AH ;AL=AL+AH=96H+78H(=10EH)=0EH 前面的1给了进位标志CF。
即(AH)=78H (AX)=780EH
CF=1 PF=0 AF=0 ZF=0 SF=0 OF=0
例如:ADD DX,0F0F0H
执行前(DX)=4652H
执行后(DX)=4652H+F0F0H(=13742H)=3742H 前面的1给了进位标志CF。
ZF=0 SF=0 CF=1 OF=0
这里4的二进制码是0100,F是1111,一个正数一个负数相加肯定OF是0。
例如:ADD AX,4321
执行前(AX)=62A0H
执行后(AX)=62A0+4321=A5C1H 这里要注意,A的二进制数是1010,最高有效位为1,所以SF为1。
两个正数相加,结果为负的就溢出;两个负数相加,结果为正的就溢出。
SF=1 ZF=0 CF=0 OF=1
这里6的二进制码是0110,而4的二进制码是0100,两个正数相加,结果A为1010为负,所以OF为1。
从上面例子可看出:加法指令影响标志位。
OF位根据操作数的符号及其变化情况来设置:若两个操作数的符号相同而结果的符号与之相反时OF=1,否则OF=0。
CF位可以用来表示无符号数的溢出。由于无符号数的最高有效位只有数值意义而无符号意义,所以从该位产生的进位应该是结果的实际进位值,但在有限数的范围内就说明了结果。
2.带进位加指令ADC(Add with Carry)
格式:ADC OPRD1,OPRD2
执行的操作:(OPRD1)←(OPRD1)+(OPRD2)+(CF)
例如:下列指令序列执行两个双精度(32位)的加法。设目的操作数放在DX和AX寄存器中,其中DX存放高位字,源操作数存放在BX、CX中,其中BX存放高位字。(双精度的数高位和高位相加,低位和低位相加,首先加低位。)
如指令执行前:(DX)=0002H (AX)=0F365H (BX)=0005H (CX)=0E024H
指令序列为:ADD AX,CX
ADC DX,BX
执行第一条指令后:
(AX)=AX+CX=F365+E024)=1D389)=D389H
SF=1 ZF=0 CF=1 OF=0
这里F的二进制是1111,E的二进制是1110,得出的D是1101。所以OF为0。(8以上全是负的,8以下全是正的)
执行第二条指令后:
(DX)=DX+BX+CF=0002+0005+0001=0008H
SF=0 ZF=0 CF=0 OF=0
则该指令序列执行完后:(DX)=0008H (AX)=D389H
从上面的例子可以看出:
为实现双精度加法,必须用两条指令分别完成低位字和高位字的加法,而且在高位字相加时,应该使用ADC指令以便把前一条ADD指令作低位字加法所产生的进位值加入高位字之内。另外,带符号的双精度数的溢出,应该根据ADC指令的OF位来判断,而作低位加法用的ADD指令的溢出是无意义的。此指令影响标志位。
3.加1指令INC(INCrement)
格式:INC OPRD
这条指令完成对操作数OPRD加1,然后把结果送回OPRD,即:
(OPRD)←(OPRD)+1
操作数OPRD可以是通用寄存器,也可以是存储单元。这条指令执行的结果影响标志ZF、SF、OF、PF和AF,但它不影响CF。
该指令主要用于调整地址指针和计数器。
例如:写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。
要求使用以下几种寻址方式:
(1)寄存器间接寻址
MOV BX,OFFSET BLOCK ;首先把BLOCK里的偏移地址送给BX ,这里也可以用LEA BX,BLOCK
ADD BX,000AH
MOV DS,[BX]
(2)寄存器相对寻址
LEA BX,BLOCK
文档评论(0)