80X86汇编语言程序设计第二章⑤80868088指令.docx

上传人:b****5 文档编号:8320359 上传时间:2023-01-30 格式:DOCX 页数:7 大小:18.44KB
下载 相关 举报
80X86汇编语言程序设计第二章⑤80868088指令.docx_第1页
第1页 / 共7页
80X86汇编语言程序设计第二章⑤80868088指令.docx_第2页
第2页 / 共7页
80X86汇编语言程序设计第二章⑤80868088指令.docx_第3页
第3页 / 共7页
80X86汇编语言程序设计第二章⑤80868088指令.docx_第4页
第4页 / 共7页
80X86汇编语言程序设计第二章⑤80868088指令.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

80X86汇编语言程序设计第二章⑤80868088指令.docx

《80X86汇编语言程序设计第二章⑤80868088指令.docx》由会员分享,可在线阅读,更多相关《80X86汇编语言程序设计第二章⑤80868088指令.docx(7页珍藏版)》请在冰豆网上搜索。

80X86汇编语言程序设计第二章⑤80868088指令.docx

80X86汇编语言程序设计第二章⑤80868088指令

80X86汇编语言程序设计

第二章8086/8088寻址方式和指令系统

(二加减运算指令

1.加法指令ADD

格式:

ADDOPRD1,OPRD2

执行的操作:

(OPRD1←(OPRD1+(OPRD2

例如:

MOVAX,7896H;(AX=7896H

即(AH=78H(AL=96H;各标志位保持不变

ADDAL,AH;AL=AL+AH=96H+78H(=10EH=0EH前面的1给了进位标志CF。

即(AH=78H(AX=780EH

CF=1PF=0AF=0ZF=0SF=0OF=0

例如:

ADDDX,0F0F0H

执行前(DX=4652H

执行后(DX=4652H+F0F0H(=13742H=3742H前面的1给了进位标志CF。

ZF=0SF=0CF=1OF=0

这里4的二进制码是0100,F是1111,一个正数一个负数相加肯定OF是0。

例如:

ADDAX,4321

执行前(AX=62A0H

执行后(AX=62A0+4321=A5C1H这里要注意,A的二进制数是1010,最高有效位为1,所以SF为1。

两个正数相加,结果为负的就溢出;两个负数相加,结果为正的就溢出。

SF=1ZF=0CF=0OF=1

这里6的二进制码是0110,而4的二进制码是0100,两个正数相加,结果A为1010为负,所以OF为1。

从上面例子可看出:

加法指令影响标志位。

OF位根据操作数的符号及其变化情况来设置:

若两个操作数的符号相同而结果的符号与之相反时OF=1,否则OF=0。

CF位可以用来表示无符号数的溢出。

由于无符号数的最高有效位只有数值意义而无符号意义,所以从该位产生的进位应该是结果的实际进位值,但在有限数的范围内就说明了结果。

2.带进位加指令ADC(AddwithCarry

格式:

ADCOPRD1,OPRD2

执行的操作:

(OPRD1←(OPRD1+(OPRD2+(CF

例如:

下列指令序列执行两个双精度(32位的加法。

设目的操作数放在DX和AX寄存器中,其中DX存放高位字,源操作数存放在BX、CX中,其中BX存放高位字。

(双精度的数高位和高位相加,低位和低位相加,首先加低位。

如指令执行前:

(DX=0002H(AX=0F365H(BX=0005H(CX=0E024H指令序列为:

ADDAX,CX

ADCDX,BX

执行第一条指令后:

(AX=AX+CX=F365+E024=1D389=D389H

SF=1ZF=0CF=1OF=0

这里F的二进制是1111,E的二进制是1110,得出的D是1101。

所以OF为0。

(8以上全是负的,8以下全是正的

执行第二条指令后:

(DX=DX+BX+CF=0002+0005+0001=0008H

SF=0ZF=0CF=0OF=0

则该指令序列执行完后:

(DX=0008H(AX=D389H

从上面的例子可以看出:

为实现双精度加法,必须用两条指令分别完成低位字和高位字的加法,而且在高位字相加时,应该使用ADC指令以便把前一条ADD指令作低位字加法所产生的进位值加入高位字之内。

另外,带符号的双精度数的溢出,应该根据ADC指令的OF位来判断,而作低位加法用的ADD指令的溢出是无意义的。

此指令影响标志位。

3.加1指令INC(INCrement

格式:

INCOPRD

这条指令完成对操作数OPRD加1,然后把结果送回OPRD,即:

(OPRD←(OPRD+1

操作数OPRD可以是通用寄存器,也可以是存储单元。

这条指令执行的结果影响标志ZF、SF、OF、PF和AF,但它不影响CF。

该指令主要用于调整地址指针和计数器。

例如:

写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。

要求使用以下几种寻址方式:

(1寄存器间接寻址

MOVBX,OFFSETBLOCK;首先把BLOCK里的偏移地址送给BX,这里也可以用LEABX,BLOCK

ADDBX,000AH

MOVDS,[BX]

(2寄存器相对寻址

LEABX,BLOCK;也可以MOVBX,OFFSETBLOCK

MOVDX,[BX]000AH]

4.减法指令SUB(SUBtraction

格式:

SUBOPRD1,OPRD2

执行的操作:

(OPRD1←(OPRD1-(OPRD2

例如:

SUB[SI+14H],0136H

指令执行前(DS=3000H,(SI=0040H,(30054H=4336

物理地址=DS+SI+14H=30000+0040+0014=30054HSUB(30054H=4336-0136=4200H指令执行后(30054H=4200H

SF=0ZF=0CF=0OF=0

例如:

SUBDH,[BP+4]

指令执行前(DH=41H,(SS=0000H,(BP=00E4H,(000E8H=5AH

SS:

BP=00000+00E4+4=000E8=5AH

SIBDH-BP=41H-5AH=E7H

指令执行后(DH=0E7H

SF=1ZF=0CF=1OF=0

此指令影响标志位CF位说明无符号数相减的溢出,同时它又是被减数的最高有效位向高位的借位值。

OF位则说明带符号数的溢出。

减法的OF位的设置方法为:

若两个数的符号相反,而结果的符号与减数相同则OF=1。

说明结果是错误的。

5.带借位减指令SBB(SuBtractwithBorrow

格式:

SBBOPRD1,OPRD2

执行的操作:

(OPRD1←(OPRD1-(OPRD2-CF

例如:

SBBAL,DL

SBBDX,AX

该指令主要用于多字节数相减的场合。

6.减1指令DEC(DECrement

格式:

DECOPRD

执行的操作:

(OPRD←(OPRD-1

例如:

DECVARB;VARB是字节变量

操作数OPRD可以是通用寄存器,也可以是存储单元。

在相减时,把操作数作为一个无符号数对待。

这条指令执行的结果影响标志ZF、SF、OF、PF和AF,但不影响CF。

7.取补指令NEG(NEGate

格式:

NEGOPRD

执行的操作:

(OPRD←0-(OPRD

这条指令对操作数取补,就是用零减去操作数OPRD,再把结果送回OPRD。

(各位取反末尾加1操作数可以是通用寄存器,也可以是存储单元。

例如:

NEGAL

NEGVARW[SI];有效地址就是VARW的位移加SI的值

如在字节操作时对-128取补,或在字操作时对-32768取补,则操作数不变,但OF被置1。

其它均为0。

此指令的执行结果影响CF、ZF、SF、OF、AF和PF,操作数为0时,求补运算的结果使CF=0,其它情况则均为1。

8.比较指令CMP(CoMPare

格式:

CMPOPRD1,OPRD2

这条指令完成操作数OPRD1减去操作数OPRD2,运算结果不送到OPRD1。

但影响标志CF、ZF、SF、OF、AF和PF。

例如:

CMPSI,DI

CMPCL,5

CMPDX,[BP-4]

比较指令主要用于比较两个数的关系,是否相等,谁大谁小。

执行了比较指令后,可根据ZF是否置位,判断两者是否相等;如果两者是无符号数,则可根据CF判断大小;如果两者是有符号

数,则要根据SF和OF判断大小。

例如:

设X,Y,Z均为双精度数,它们分别存放在地址为X,X+2,Y,Y+2,Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中。

下列指令序列实现W←X+Y+24-Z并用W和W+2单元存放运算结果。

MOVAX,X

MOVDX,X+2

ADDAX,Y

ADCDX,Y+2

ADDAX,24

ADCDX,0

SUBAX,Z

SBBDX,Z+2

MOVW,AX

MOVW+2,DX

例如:

设当前数据段寄存器的内容为1B00H,在数据段的偏移地址2000H单元内,含有一个内容为0FF10H和8000H的指针,它们是一个16位变量的便宜地址和段地址,试写出把该变量装入AX的指令序列。

MOVBX,[2000H]

MOVES,[2002H]

MOVAX,ES:

[BX]

例如:

写出执行以下计算的指令序列,其中X,W,Z均为存放16位带符号数单元的地址。

Z←W+(Z-X

一法:

MOVAX,Z

MOVBX,X

SUBAX,BX

MOVBX,W

ADDAX,BX

MOVZ,AX

二法:

MOVAX,Z

SUBAX,X

ADDAX,W

MOVZ,AX

遇到双精度数用AX存放低字,用DX存放高字。

先进行低字的加减法,再进行高字的加减法,因为在高位还要算入带进位的加减法。

例如:

写出对存放在DX和AX中的双字长数求补的指令序列

答案:

NEGDX

NEGAX

SBBDX,0

如果是双字数进行求补,首先对高位(DX进行求补,然后再对低位(AX求补、求补:

用0减或者各位取反末尾加一。

一.指出下列指令的错误:

MOVAH,BXAH是8位寄存器,BX是16位寄存器;(寄存器寻址

MOVAX,[SI][DI]SI时源变址寄存器,DI是目的变址寄存器,两个都是变址寄存器,应该有一个是基址;(基址加变址寻址

CMP15,BX目的操作数不能是立即数;

PUSHBL压栈都是以字为单位;

POPCS出栈不能是CS,CS不能做目的操作数;

MOV[BX],[SI]转移指令俩不能都是存储单元;

MOVCS,AX代码段CS不能做目的操作数;

CMPOP1,OP2(OP1,OP2是已定义的字节变量不能同时比较两个字节单元;

CMPAX,OP1(OP1是已定义的字节变量AX是字而OP1是字节,类型不匹配。

(1分辨是单操作数还是双操作数;

(2如果是双操作数,那么它是根据什么寻址方式;

(3双操作数的目的操作数不能是立即数;

(4两个操作数中必须有一个是寄存器(除了立即寻以外;

(5双操作数中,代码段CS不能做目的操作数;

(6最后检查两个操作数的类型是否匹配;

(如果是单操作数,栈操作都是以字为单位(16位寄存器和16位地址;

(单操作数中,代码段CS不能做目的操作数;

二.完成对字单元BUF的内容加1运算,下面错误的指令是?

A.MOVBX,BUF;直接寻址,把BUF的内容送给BXINCBX

MOVBUF,BX

B.MOVBX,OFFSETBUF;把BUF的偏移地址给了BX

INCWORDPTR[BX];将BX中地址字单元的内容加1

C.MOVBX,BUF;直接寻址,把BUF的内容送给BXINCWORDPTR[BX];将BX中地址字单元的内容加1

D.MOVBX,0;将BX清零

INCWORDPTRBUF[BX]

BUF是一个符号地址。

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

当前位置:首页 > 求职职场 > 自我管理与提升

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

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