计算机三级偏软包过之三级汇编_第1页
计算机三级偏软包过之三级汇编_第2页
计算机三级偏软包过之三级汇编_第3页
计算机三级偏软包过之三级汇编_第4页
计算机三级偏软包过之三级汇编_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机三级偏软包过之三级汇编1/1318086寄存器组8086有14个寄存器,它们都是16位的,这些寄存器按功能可为6类:(1)通用寄存器(4个)(2)地址指针寄存器(2个)(3)变址寄存器(2个)(4)段寄存器(4个)(5)指令指针寄存器(1个)(6)标志寄存器(1个)1/1318086寄存器组1/1311)、通用寄存器(1)数据寄存器(AX、BX、CX、DX)数据寄存器用来保存操作数或运算结果等信息。

AX寄存器称为累加器。使用频度最高,用于所有的输入/输出操作。某些字串操作以及算术运算,如乘法、除法,某些翻译指令也使用AX寄存器。

BX寄存器称为基址寄存器。常用于存放存储器地址。用于扩展寻址,起变址作用。

CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。

DX寄存器称为数据寄存器。常用于字乘法和除法中存放双字数据的高16位,或用来存放外设端口地址。1/131(2)变址寄存器

A、SI寄存器源变址寄存器。在字串操作中,常用SI表示字串的源地址,段地址在DS中。

B、DI寄存器目的变址寄存器。在字串操作中,常用DI表示操作的目的地址,它常和附加段寄存器ES相关连,如前述的字符串传递操作,DI就表示了传送的目的地地址偏移。在字符串操作中,SI和DI都具有自动增量或减量的功能。1/131(3)地址指针寄存器

A、SP寄存器堆栈指针寄存器。在访问堆栈时,段地址在SS中,SP则表示偏移地址。

B、BP寄存器基址指针寄存器。在通过堆栈传递数据和地址时,段地址在SS,BP存放要传递的数据和地址的偏移地址。BP也可作为通用寄存器用。当SI、DI、BP不用作变址寄存器和指针寄存器时,也可以作16位数据寄存器使用,用来保存操作数和运算结果。1/1312)、段寄存器

8086设立了4个16位的段寄存器用来保存4个当前段的起始基址(省略了地址的低4位,即每段从内存段界开始,低4位认为是0),分别称为代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS和附加数据段寄存器ES。(1)CS寄存器代码段寄存器。它含有当前执行程序所在段的首地址,这个段寄存器内容左移4位(即乘16)再加上指令指针寄存器(IP)的内容,就是下一条要执行的指令地址。

(2)DS寄存器数据段寄存器。它含有当前数据段的首地址,通常数据段用来存放数据和变量,数据段寄存器内容加上指令中的偏移值,即为对数据段指定单元操作的地址。1/131(3)SS寄存器堆栈段寄存器。它保存当前堆栈的首地址。堆栈是存储器中设置的一种数据结构,用于存放数据和地址,有先进后出的特点,在调用子程序时,保留返回主程序的地址,也用来保留进入子程序将要改变其值的各寄存器的内容等。(4)ES寄存器附加段寄存器。附加段是在进行字符串操作时,作为目的段地址使用,这个附加段是附加的一个数据段,如用DS作为数据段段地址,SI为源地址偏移,将一个字串从源传送到目的区去,这个目的区可设在附加段中,即ES装附加段地址,DI寄存目的区地址的偏移。如果要使用附加段,用户程序必须对ES初始化,即设置值,否则ES=DS,即数据段和附加数据段重合。1/1313)、指令指针寄存器

8086CPU中有一个很重要的16位指令指针寄存器IP,它总是保存下一次将要从主存中取出指令的偏移地址(简称EA),其值为该指令到所在代码段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。1/1314)、标志寄存器

程序有时需根据上次指令执行的结果,判断以决定执行的方向,为此8086设有一个很重要的16位标志寄存器,它包含9个标志位,共占用2个字节。它们主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征,其中六位作为指令执行结果的条件标志,三位用作控制标志。这些标志位在标志寄存器中的位置如下:1/131A.条件标志(1)符号标志SF

第7位。对带符号的数操作时,若产生一个负的结果,则SF=1,否则为0,当算术、逻辑、移位或循环移位操作时,都将影响此位。(2)零标志ZF

第6位。当运算结果为零时,ZF=1,结果非零,则ZF=0。(3)溢出标志OF

第11位。当带符号数算术运算时,商位溢出,则OF=1,否则为0,它用来作错误指示标志。1/131(4)进位标志CF

第0位。如果算术指令执行完后,最高位产生进位或借位,则CF=1,否则CF=0。CF还可保存移位或循环移位时移出的一位值,也可给出比较操作的结果,也可作为乘法结果的指示器。(5)辅助进位标志AF第4位。当操作数第3位产生进位或借位时,AF=1,否则AF=0,这个标志多用于压缩的十进制数操作。(6)奇偶标志PF第2位。当操作结果含有偶数个1时,PF=1,否则PF=0,这个标志多用于数据输中。1/131B.状态控制标志

(1)方向标志DF第10位。可用指令预置。当DF=0时,执行串操作指令后,变址寄存器自动递增,当DF=1时,则动递减。即该标志可控制地址朝增加的方向或减少的方向改变。(2)中断允许标志IF第9位。当用指令置为1时,则允许8088响应中断请求,若为0时,则禁止响应中断请求。(3)跟踪标志TF第8位。当置为1时,则8088处于单步执行指令方式,每执行一条指令,自产动产生一个类型为1的中断。1/131主存储器和堆栈

1.主存储器存储单元的地址和内容

存储器是计算机的记忆部件,用来存放程序和数据。按所在的位置,存储器可以分成主存储器和辅助存储器。主存储器的基本存储单位是位,它能容纳一个二进制数的0和1。整个主存由许多存储位构成,这些存储位每8位组合成一个字节,每相邻的2个字节又可组成一个字。一个字节或一个字就构成一个字节或字存储单元。

存储单元地址:8086系统中,为了标识和存取每一个存储单元,给每个存储单元规定一个编号,这就是存储单元的物理地址(简称PA)。1/131

右图表明了存储器中部分存储单元存放信息情况。从图1.4可看到,地址为34560H的字节的存储单元中的内容是34H,而地址为34561H的字节存储单元中的内容是12H。1/1312、物理地址的形成

8086CPU的地址线是20位的,这样最大可寻址空间应为220=1MB,其物理地址范围从00000H~FFFFFH。而8086CPU寄存器都是16位的。那么,这1MB空间如何用16位寄存器表达呢?根据要求可把1M字节地址空间划成若干逻辑段。每个逻辑段必须满足两个条件:一是逻辑段的起始地址(简称段首址)必须是16的倍数,这就使段首址的最低4位总为0,高16位正好装入一个段寄存器中;二是逻辑段的最大长度为64K,这样某单元在段内的相对位置可用16位段内偏移地址表示。

由于CPU只设置了4个段寄存器,因此,CPU在当前某一时刻最多只能访问4个段,即当前代码段、当前堆栈段、当前数据段和当前附加数据段,它们的首址分别由CS、SS、DS、ES给出。1/1311)、代码段代码段是程序代码的存储区。当前代码段在主存中的起始地址由代码段寄存器CS确定,指令指示器IP总是保存着下一条将要取出指令相对于CS的偏移地址,如果要取出这条指令执行,它的物理地址PA应为:

PA=(CS)左移4位+(IP)2)、堆栈段堆栈段可以用来作程序的临时数据存储区,存放暂时不用的数据。往堆栈中压入数据和从栈中弹出数据时,栈顶的物理地址为::

PA=(SS)左移4位+(SP)1/1313)、数据和附加数据段数据段是程序中所使用的数据存储区,分为数据段和附加数据段,其段首址分别由数据段寄存器DS与附加数据段寄存器ES确定。当访问数据段中某一变量时,其物理地址为:

PA=(DS或ES)左移4位+该变量的偏移地址4)、段的分配存储器分段方式并非把1M字节划分成16个64K字节的段使用,而是指CPU每次只能访问4个段。这4个段可以分配在1M字节内的任何地方,它们可以是完全重叠的,也可以是部分重叠或不重叠的,而且可以按任意顺序存放在主存的可寻址空间中。1/131访问存储器的方式

默认的段寄存器可跨越的段寄存器偏移地址取指令CS无IP堆栈操作SS无SP一般数据访问DSCSESSS有效地址EABP作为基址的寻址SSCSDSESBP串操作的源操作数DSCSESSSSI串操作的目的操作数ES无DI段寄存器的使用规定1/131跨段前缀示例。

MOV AX,DS:[BP]MOV CX,SS:[SI]

该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:

PA1=(DS)左移4位+[BP]PA2=(SS)左移4位+[SI]1/131汇编语言指令格式如下:

[标号场:]操作场[操作数场][;注释场]其中:

[]:表示该项内容可要可不要。

[标号场]:表示该指令的在代码段中的偏移地址,可以不要,标号后用“:”与操作场连接。

操作场:表示该操作的功能,不能省略。

[操作数场]:表示该指令所需的操作数,各操作数之间用“,”隔开。当操作数为两个时,一般地前面的称为目的操作数DST,后面的称为源操作数SRC。

[;注释场]:对该指令进行说明,起到帮助读者阅读理解的作用,不参加指令的执行。

例如:NEXT1:MOVAX,0;MOVE0TOAX1/1318086/8088寻址方式

计算机指令寻找操作数存放地址的方式称为指令的寻址方式。数据类型操作数分为:(1)立即数操作数:指令中所需的操作数为立即数,即我们常说的常量或常数。(2)寄存器操作数:指令中所需的操作数放在指定的寄存器中。(3)存储器操作数:指令中所需的操作数放在指定的存储器中的存储单元中,而指令中的操作数提供存储单元的偏移地址。(4)I/O操作数:指令中所需的操作数来源于I/O端口。1/131以

MOV

指令为例

立即寻址MOVAX,3069H寄存器寻址MOVAL,BH直接寻址MOVAX,[2000H]寄存器间接寻址MOVAX,[BX]寄存器相对寻址MOVAX,COUNT[SI]基址变址寻址MOVAX,[BP][DI]相对基址变址寻址MOVAX,MASK[BX][SI]1/131

数据传送指令

算术指令

逻辑指令

串处理指令

控制转移指令

处理机控制与杂项操作指令8086/8088指令系统

8086的指令系统可以分为6组:

1/131一、数据传送指令:

通用数据传送指令

MOV、PUSH、POP、XCHG

累加器专用传送指令

IN、OUT、XLAT

地址传送指令

LEA、LDS、LES

标志寄存器传送指令

LAHF、SAHF、PUSHF、POPF

类型转换指令

CBW、CWD1/131(1)传送指令:MOVDST,SRC

执行操作:(DST)(SRC)注意:*DST不能是

CS*DST、SRC不能同时为段寄存器

MOVDS,ES

*

立即数不能直接送段寄存器

MOVDS,2000H

*

DST不能是立即数*

DST、SRC不能同时为存储器寻址1、

通用数据传送指令1/131(2)进栈指令:PUSHSRC

执行操作:(SP)

(SP)–2((SP)+1,(SP))

(SRC)(3)出栈指令:POPDST

执行操作:(DST)

((SP)+1,(SP))(SP)

(SP)+2堆栈:‘先进后出’的存储区,存在于堆栈段中,SP

在任何时候都指向栈顶。

注意:*堆栈操作必须以字为单位。

*不影响标志位

*不能用立即寻址方式

PUSH1234H

*DST不能是CSPOPCS

1/131例:假设(AX)=2107H,执行

PUSHAX********(SP)

PUSHAX执行前(SP)

********07H21H低地址

高地址PUSHAX执行后进栈方向1/131(SP)

********07H21HPOPBX执行前(SP)

********07H21H低地址

高地址POPBX执行后

(BX)=2107H例:POPBX出栈方向1/131例:PUSHDSSUBAX,AXPUSHAX……RET例:PUSHAXPUSHBXPUSHCX……;其间用到AX、BX、CXPOPCXPOPBXPOPAX1/131(4)交换指令:XCHGOPR1,OPR2

执行操作:(OPR1)

(OPR2)注意:

*

不影响标志位

*不允许使用段寄存器例:XCHGBX,[BP+SI]XCHGAL,BH1/1312、累加器专用传送指令(只限使用AX或AL)(1)输入指令(I/O

CPU)

长格式:INAL,PORT

(字节)

INAX,PORT

(字)执行操作:(AL)

(PORT)(字节)

(AX)

(PORT+1,PORT)(字)短格式:INAL,DX

(字节)

INAX,DX

(字)执行操作:(AL)((DX))(字节)

(AX)((DX)+1,(DX))(字)

1/131(2)输出指令(CPU

I/O)长格式:OUTPORT,AL

(字节)

OUTPORT,AX

(字)执行操作:(PORT)

(AL)(字节)

(PORT+1,PORT)

(AX)(字)短格式:OUTDX,AL

(字节)

OUTDX,AX

(字)执行操作:((DX))

(AL)(字节)

((DX)+1,(DX))

(AX)(字)1/131注意:*

不影响标志位*

前256个端口号00H~FFH可直接在指令中指定(长格式)*如果端口号

256,端口号

DX(短格式)例:测试某状态寄存器(端口号27H)的第2位是否为1INAL,27HTESTAL,00000100BJNZERROR;若第2位为1,

转ERROR处理1/131(BX)

30HF004031HF0041(AL)=332HF004233HF0043TABLE(DS)=F000H(3)换码指令:XLAT

或XLATOPR

执行操作:(AL)

((BX)+(AL))例:MOVBX,OFFSETTABLE;(BX)=0040HMOVAL,3XLATTABLE

指令执行后(AL)=33H注意:*

不影响标志位*

字节表格(长度不超过256)

首地址

(BX)*

需转换代码(AL)1/1313、地址传送指令

(1)有效地址送寄存器指令:

LEAREG,SRC

执行操作:(REG)

SRC

(2)指针送寄存器和DS指令:

LDSREG,SRC

执行操作:(REG)

(SRC)(DS)

(SRC+2)

4个相继字节

寄存器(通常是SI)、DS

(3)指针送寄存器和ES指令:

LESREG,SRC

执行操作:(REG)

(SRC)(ES)

(SRC+2)

4个相继字节

寄存器(通常是DI)、ES1/1314、标志寄存器传送指令

(1)标志送AH指令:

LAHF

执行操作:(AH)

(PSW的低字节)

(2)AH送标志寄存器指令:

SAHF

执行操作:(PSW的低字节)

(AH)

(3)标志进栈指令:

PUSHF

执行操作:(SP)

(SP)-2((SP)+1,(SP))

(PSW)

(4)标志出栈指令:

POPF

执行操作:(PSW)

((SP)+1,(SP))(SP)

(SP)+2*影响标志位1/1315、类型转换指令

(1)CBWAL

AX执行操作:若(AL)的最高有效位为0,则(AH)=00H

若(AL)的最高有效位为1,则(AH)=0FFH(2)CWDAX

(DX,AX)执行操作:若(AX)的最高有效位为0,则(DX)=0000H

若(AX)的最高有效位为1,则(DX)=0FFFFH注意:

*

无操作数指令

*隐含对AL或AX进行符号扩展

*不影响条件标志位1/131二、算术指令:

加法指令

ADD、ADC、INC

减法指令

SUB、SBB、DEC、NEG、CMP

乘法指令

MUL、IMUL

除法指令

DIV、IDIV

十进制调整指令

DAA、DAS、

AAA、AAS、AAM、AAD1/1311、加法指令(1)加法指令:

ADDDST,SRC

执行操作:(DST)

(SRC)+(DST)(2)带进位加法指令:

ADCDST,SRC

执行操作:(DST)

(SRC)+(DST)+CF(3)加1指令:

INCOPR

执行操作:(OPR)

(OPR)+1注意:*

除INC指令不影响CF标志外,均对条件标志位有影响1/131加法指令对条件标志位(CF/OF/ZF/SF)的影响:CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。1结果为负0否则SF=1结果为00否则ZF=1和的最高有效位有向高位的进位0否则CF=1两个操作数符号相同,而结果符号与之相反0否则OF=1/131n=8bit带符号数(-128~127)无符号数(0~255)

00000100+0000101100001111带:(+4)+(+11)=+15OF=0无:4+11=15CF=0带符号数和无符号数都不溢出00001001+0111110010000101

带:(+9)+(+124)=-123OF=1

无:9+124=133CF=0带符号数溢出无符号数溢出00000111+1111101100000010带:(+7)+(-5)=+2OF=0无:7+251=2CF=1带符号数和无符号数都溢出10000111+1111010101111100带:(-121)+(-11)=+124OF=1无:135+245=124CF=11/1312、减法指令(1)减法指令:

SUBDST,SRC

执行操作:(DST)

(DST)-(SRC)

(2)带借位减法指令:SBBDST,SRC

执行操作:(DST)

(DST)-(SRC)-CF(3)减1指令:

DECOPR

执行操作:(OPR)

(OPR)-11/131(4)求补指令:

NEGOPR

执行操作:(OPR)

-(OPR)(5)比较指令:

CMPOPR1,OPR2

执行操作:(OPR1)-(OPR2)注意:*除DEC指令不影响

CF标志外,均对条件标志位有影响。1/131减法指令对条件标志位(CF/OF/ZF/SF)的影响:CF

位表示无符号数减法的溢出。OF

位表示带符号数减法的溢出。1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=1减法转换为加法运算时无进位0否则CF=或1/131NEG指令对CF/OF的影响:0操作数为01否则CF=1操作数为-128(字节运算)或操作数为-32768(字运算)0否则OF=1/1313、乘法指令(1)无符号数乘法指令:

MULSRC

执行操作:字节操作数(AX)

(AL)*(SRC)

字操作数(DX,AX)

(AX)*(SRC)(2)带符号数乘法指令:

IMULSRC

执行操作:同上注意:*AL(AX)为隐含的乘数寄存器。*

AX(DX,AX)为隐含的乘积寄存器。*

SRC不能为立即数。*除CF和OF外,对条件标志位无定义。1/131乘法指令对CF/OF的影响:00乘积的高一半为零11否则MUL指令:CF/OF=00乘积的高一半是低一半的符号扩展11否则

IMUL指令:CF/OF=1/1314、除法指令

无符号数除法指令:DIVSRC

执行操作:字节操作(AL)

(AX)/(SRC)的商

(AH)

(AX)/(SRC)的余数字操作(AX)

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余数

带符号数除法指令:IDIVSRC注意:

*AX(DX,AX)为隐含的被除数寄存器。

*

AL(AX)为隐含的商寄存器。

*

AH(DX)为隐含的余数寄存器。

*

SRC不能为立即数。

*

对所有条件标志位均无定义。1/1315、十进制调整指令BCD码:用二进制编码的十进制数,又称二--十进制数压缩的BCD码:用4位二进制数表示1位十进制数例:(59)10=(01011001)BCD非压缩的BCD码:用8位二进制数表示1位十进制数例:(59)10=(0000010100001001)BCD数字的ASCII码是一种非压缩的BCD码

DIGIT ASCII BCD0 30H 001100001 31H 00110001… … …9 39H 001110011/131例:写出(3590)10的压缩BCD码和非压缩BCD码,并分别把它们存入数据区

PAKED

和UNPAK压缩BCD: (3590)10=(0011010110010000)BCD非压缩BCD:

(3590)10=(00000011000001010000100100000000)BCDPAKED

90H35HUNPAK

00H09H05H03H1/131问题的提出:十进制调整指令19压缩BCD:000110012700100001+110+08+00001000(00100111)BCDAF=11/131A、压缩BCD码调整指令:

加法的压缩BCD码调整指令DAA

减法的压缩BCD码调整指令DAS1/131(1)加法的十进制调整指令DAA

调整指令:DAA执行操作:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则(AL)=(AL)+6且(AF)=1;如果(AL)>=0A0H或(CF)=1,则(AL)=(AL)+60H且(CF)=1。同时,SF、ZF、PF均有影响。例:压缩BCD码的加法运算。

MOVAL,68H

;(AL)=68H,表示压缩BCD码68

MOVBL,28H

;(BL)=28H,表示压缩BCD码28

ADDAL,BL

;二进制加法:(AL)=68H+28H=90H

DAA

;十进制调整:(AL)=96H

;实现压缩BCD码加法:68+28=961/131

(2)减法的十进制调整指令DAS调整指令:

DAS执行操作:

如果(AF)=1或AL寄存器中低4位大于9,则(AL)=(AL)-6且(AF)=1;如果(AL)>=0A0H或(CF)=1,则(AL)=(AL)-60H且(CF)=1。同时SF、ZF、PF均受影响。例:压缩BCD码的减法运算。

MOV AL,68H

;(AL)=68H,表示压缩BCD码68

MOV BL,29H

;(BL)=29H,表示压缩BCD码29

SUB AL,BL

;二进制减法:(AL)=68H-29H=03FH

DAS

;十进制调整:(AL)=39H

;实现压缩BCD码减法:68-29=391/131B、非压缩BCD码调整指令:

加法的非压缩BCD码调整指令AAA

减法的非压缩BCD码调整指令AAS

乘法的非压缩BCD码调整指令AAM

除法的非压缩BCD码调整指令AAD1/131(1)加法的非压缩BCD码调整指令AAA

语句格式:AAA

指令功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)+6

(AH)=(AH)+1

(AF)=(CF)=1

且AL高4位清零。否则:(CF)=(AF)=0AL高4位清零。1/131

(2)减法的非压缩BCD码调整指令AAS

语句格式:AAS

指令功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)-6

(AH)=(AH)-1

(AF)=(CF)=1AL高4位清零。否则:(CF)=(AF)=0

AL高4位清零。其他标志位OF、PF、SF、ZF不确定。1/131(3)乘法的非压缩BCD码调整指令AAM

语句格式:AAM

指令功能:

被调整的乘积在AX中,对AL按10取模,则:(AL)/0AH→AH(商):AL(余数)其中AH为商,AL为余数,标志位AF、CF、OF、

PF、SF、ZF受影响。

1/131(4)除法的非压缩BCD码调整指令AAD

语句格式:AAD

指令功能:

除法运算前,先调整被除数AX内容,使:(AL)=(AL)+(AH)*0AH

(AH)=0

即把非压缩型十进制数变成二进制数。1/131三、逻辑指令:

逻辑运算指令

AND、OR、NOT、XOR、TEST

移位指令

SHL、SHR、SAL、SAR、

ROL、ROR、RCL、RCR1/131逻辑非指令:NOTOPR*OPR不能为立即数执行操作:(OPR)

(OPR)*不影响标志位

逻辑与指令:ANDDST,SRC执行操作:(DST)

(DST)

(SRC)逻辑或指令:ORDST,SRC执行操作:(DST)

(DST)

(SRC)异或指令:XORDST,SRC执行操作:(DST)

(DST)

(SRC)测试指令:TESTOPR1,OPR2

执行操作:(OPR1)

(OPR2)CFOFSFZFPFAF00***无定义

根据运算结果设置1、逻辑运算指令1/131例:屏蔽AL的第0、1两位

ANDAL,0FCH例:置AL的第5位为1

ORAL,20H

例:使AL的第0、1位变反

XORAL,3例:测试某些位是0是1

TESTAL,1JZEVEN

********OR00100000**1*****

********XOR00000011

********

********AND11111100******001/1312、移位指令逻辑左移SHLOPR,CNT逻辑右移SHROPR,CNT算术左移SALOPR,CNT(同逻辑左移)算术右移SAROPR,CNT

CF0

0CFCF1/131循环左移ROLOPR,CNT循环右移ROROPR,CNT带进位循环左移RCLOPR,CNT带进位循环右移RCROPR,CNTCF

CFCFCF1/131注意:

*OPR可用除立即数以外的任何寻址方式*

CNT=1,SHLOPR,1CNT>1,MOVCL,CNTSHLOPR,CL;以SHL为例*条件标志位:

CF=移入的数值

1CNT=1时,最高有效位的值发生变化0CNT=1时,最高有效位的值不变移位指令:

SF、ZF、PF根据移位结果设置,AF无定义

循环移位指令:

不影响SF、ZF、PF、AFOF=1/131四、串处理指令:

设置方向标志指令

CLD、STD

串处理指令

串重复前缀

MOVSB/MOVSWREP

STOSB/STOSW

REPE/REPZ

LODSB/LODSW

REPNE/REPNZ

CMPSB/CMPSWSCASB/SCASW

1/131与REP

配合工作的MOVS/STOS/LODS

REPMOVS/STOS/LODS

执行操作:(1)如(CX)=0则退出

REP,否则转(2)(2)(CX)(CX)-1(3)执行MOVS/STOS/LODS(4)重复(1)~(3)1/1311、MOVS串传送指令:MOVSDST,SRCMOVSB(字节)MOVSW(字)例:MOVSES:BYTEPTR[DI],DS:[SI]

执行操作:

(1)((DI))←((SI))(2)字节操作:(SI)←(SI)±1,(DI)←(DI)±1

字操作:(SI)←(SI)±2,(DI)←(DI)±2

方向标志DF=0时用+,DF=1时用-。REPMOVS:将数据段中的整串数据传送到附加段中。源串(数据段)→目的串(附加段)1/131执行REPMOVS之前,应先做好:(1)源串首地址(末地址)→SI(2)目的串首地址(末地址)→DI(3)串长度→CX(4)建立方向标志

(CLD

使DF=0,STD

使DF=1)

1/131(SI)

(DI)

DF=0DF=1数据段附加段(SI)

(DI)

1/131datasegmentmess1db‘personal_computer’dataendsextrasegmentmess2db17dup(?)extraendscodesegment…

leasi,mess1leadi,mess2movcx,17cld

repmovsb…codeendsleasi,mess1+16leadi,mess2+16movcx,17stdrepmovsb1/1312、STOS存入串指令:STOSDSTSTOSB(字节)STOSW(字)执行操作:

字节操作:((DI))←(AL),(DI)←(DI)±1

字操作:((DI))←(AX),(DI)←(DI)±2

例:把附加段中的10个字节缓冲区置为20Hleadi,mess2moval,20Hmovcx,10cldrepstosbleadi,mess2movax,2020Hmovcx,5cldrepstosw1/1313、LODS从串取指令:

LODSSRCLODSB(字节)

LODSW(字)执行操作:字节操作:(AL)←((SI)),(SI)←(SI)±1

字操作:(AX)←((SI)),(SI)←(SI)±2注意:*LODS指令一般不与REP联用*

源串一般在数据段中(允许使用段跨越前缀来修改),

目的串必须在附加段中*不影响条件标志位1/131与REPE/REPZ(REPNE/REPNZ)配合工作的

CMPS

和SCASREPE/REPZ(REPNE/REPNZ)CMPS/SCAS

执行操作:

(1)如(CX)=0或ZF=0(ZF=1)则退出,否则转(2)(2)(CX)←(CX)-1(3)执行CMPS/SCAS(4)重复(1)~(3)1/1314、CMPS串比较指令:

CMPSSRC,DSTCMPSB(字节)

CMPSW(字)

执行操作:

(1)((SI))-((DI))

根据比较结果置条件标志位:相等ZF=1

不等ZF=0(2)字节操作:(SI)←(SI)±1,(DI)←(DI)±1

字操作:(SI)←(SI)±2,(DI)←(DI)±21/1315、SCAS串扫描指令:

SCASDSTSCASB(字节)

SCASW

(字)执行操作:字节操作:(AL)-((DI)),(DI)←(DI)±1

字操作:(AX)-((DI)),(DI)←(DI)±21/131五、控制转移指令:

无条件转移指令

JMP

条件转移指令JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ

循环指令

LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE

子程序调用和返回指令

CALL、RET

中断与中断返回指令

INT、INTO、IRET1/1311、无条件转移指令:段内直接短转移:JMPSHORTOPR

执行操作:(IP)←(IP)+8位位移量段内直接近转移:JMPNEARPTROPR

执行操作:(IP)←(IP)+16位位移量段内间接转移:JMPWORDPTROPR

执行操作:(IP)←(EA)1/131段间直接远转移:JMPFARPTROPR

执行操作:(IP)←OPR的段内偏移地址

(CS)←OPR所在段的段地址段间间接转移:JMPDWORDPTROPR

执行操作:(IP)←(EA)(CS)←(EA+2)1/1312、条件转移指令:

(1)根据单个条件标志的设置情况转移

格式测试条件

JZ(JE)OPRZF=1JNZ(JNE)OPRZF=0JSOPRSF=1JNSOPRSF=0JOOPROF=1JNOOPROF=0JPOPRPF=1JNPOPRPF=0JCOPRCF=1JNCOPRCF=01/131(2)比较两个无符号数,并根据比较结果转移*

格式测试条件

<JB(JNAE,JC)OPRCF=1>=

JNB(JAE,JNC)OPRCF=0<=

JBE(JNA)OPRCF∨ZF=1>JNBE(JA)OPRCF∨ZF=0*

适用于地址或双精度数低位字的比较1/131(3)比较两个带符号数,并根据比较结果转移*

格式测试条件

<JL(JNGE)OPRSF

OF=1>=

JNL(JGE)OPRSF

OF=0<=JLE(JNG)OPR(SF

OF)∨ZF=1>JNLE(JG)OPR(SF

OF)∨ZF=0*

适用于带符号数的比较(4)测试CX的值为0则转移

格式测试条件

JCXZOPR(CX)=01/131例:如果X>50,转到TOO_HIGH;计算

X-Y,如果溢出转到OVERFLOW,否则|X-Y|→RESULT

JGJOJNS

MOVAX,XCMPAX,50

TOO_HIGHSUBAX,Y

OVERFLOW

NONNEGNEGAXNONNEG:MOVRESULT,AXTOO_HIGH:……OVERFLOW:……1/1313、循环指令:注意:*

CX中存放循环次数*

只能使用段内直接寻址的8位位移量LOOPLOOPZ/LOOPELOOPNZ/LOOPNE

执行步骤:

(1)(CX)←(CX)-1(2)检查是否满足测试条件,如满足则

(IP)←(IP)+8位位移量,实行循环;不满足则IP不变,退出循环。先减cx,再判断1/131循环指令:LOOPOPR测试条件:(CX)

0为零或相等时循环指令:LOOPZ(LOOPE)OPR测试条件:ZF=1且(CX)

0不为零或不相等时循环指令:LOOPNZ(LOOPNE)OPR测试条件:ZF=0且(CX)

0LOOPAGAIN

DECCXJNZAGAIN1/131RET返回指令段内近返回:RET执行操作:(IP)←((SP)+1,(SP))(SP)←(SP)+2段内带立即数近返回:RETEXP段间远返回:RET执行操作:(IP)←((SP)+1,(SP))(SP)←(SP)+2(CS)←((SP)+1,(SP))(SP)←(SP)+2段间带立即数远返回:RETEXP1/131六、处理机控制与杂项操作指令:

标志处理指令

CLC、STC、CMC、

CLD、STD、

CLI、STI

其他处理机控制与杂项操作指令

NOP、HLT、WAIT、ESC、LOCK

1/1311、标志处理指令:

CLCCF←0

CMCCF←

CF

STCCF←1

CLDDF←0

STDDF←1

CLIIF←0

STIIF←1

注意:*

只影响本指令指定的标志1/1312、其他处理机控制与杂项操作指令:

NOP

无操作(机器码占一个字节)HLT

暂停机(等待一次外中断,之后继续执行程序)WAIT

等待(等待外中断,之后仍继续等待)ESC

换码

LOCK

封锁

(维持总线的锁存信号,直到其后的指令执行完)

注意:*

不影响条件标志

1/131一、伪操作(伪指令)

伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。Directives8086/8088伪指令

1/131汇编语言程序格式标号

指令寄存器说明程序或语句变量伪指令标号的功能宏指令变量常数

表达式源程序的每条语句可表示为:

[名字]操作操作数[;注释]标号/变量:段值、偏移量、类型三种属性表达式:数字表达式地址表达式1/131表达式操作符:(1)算术操作符:、、、、modMOVDX,BLOCK+(6-1)*2ARRAYDW1,2,3,4,5,6,7ARYENDDW?MOVCX,(ARYEND-ARRAY)/2ADDAX,BLOCK+2;符号地址常数

有意义

;

时意义不明确MOVAX,BX+1;

1/131OPR1EQU25OPR2EQU7

ANDAX,OPR1ANDOPR2(2)逻辑操作符:AND、OR、XOR、NOT;ANDAX,11/131关系操作符:EQ、NE、LT、LE、GT、GE(数字和地址)计算结果为逻辑值:真

0FFFFH

0000HMOVFID,

(OFFSETY-OFFSETX)LE128X:…………Y:……若

128(真)

汇编结果:

MOVFID,-1若128(假)

汇编结果:MOVFID,01/131(4)数值回送操作符:OFFSE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论