第3章 指令系统及语言程序设计_第1页
第3章 指令系统及语言程序设计_第2页
第3章 指令系统及语言程序设计_第3页
第3章 指令系统及语言程序设计_第4页
第3章 指令系统及语言程序设计_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

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

文档简介

本章主要内容指令格式、寻址方式数据传送类指令算术运算类指令逻辑运算串操作类指令(了解)控制转移类指令处理器控制指令(了解)

汇编语言源程序典型结构常用伪指令常用DOS系统功能调用四种基本结构程序设计第3章指令系统及汇编语言程序设计3.1概述一、指令系统

指令:计算机能够识别和执行的各种操作命令。指令系统:是一台计算机或一种微处理器能执行的各种不同类型操作命令的集合。8086/8088CPU指令系统共有119/117条基本指令。指令由操作码和操作数两部分组成:操作码操作数操作码说明指令要完成的操作与性质,常用OP表示,对应一组二进制编码;如:10110000B操作数给出了参与运算的操作数本身、操作数所在寄存器或在存储器中的地址,运算结果放至何处,或给出下一条执行指令的地址信息。例如:指令有两种书写格式:机器指令和符号指令

3.1概述二、机器指令格式

B0H05H

;05H送寄存器AL的机器指令第一个字节B0H是操作码(含一个操作数AL)第二个字节05H是立即数;

B8H02H01H

;0102H送寄存器AX的机器指令第一个字节B8H是操作码(含一个操作数AX)第二、三个字节02H01H是16位立即数(低字节02在低地址)。B0H05HB8H02H01HM2000H2001HM2000H2001H2002H3.1概述三、符号指令格式[标号:]操作码助记符操作数助记符[;注释]

标号:代表该条指令存放的地址。为程序分支、循环、跳转提供转移目标地址。标号后加写冒号“:”作为间隔符。操作数助记符:给出了参与运算的操作数个数和位置,可以有若干个。有两个操作数时通常称第一个为目的操作数,第二个为源操作数。操作码助记符:说明指令要完成的操作与性质。注释:以分号“;”开始,对指令加以说明以方便阅读程序。3.2寻址方式

立即寻址方式寄存器寻址方式存储器寻址方式I/O端口寻址方式(第5章介绍)寻址方式:用于说明指令中如何提供操作数或操作数存放地址的方法。有四类寻址方式:注意:不指名操作数的话是说指令中源操作数的寻址方式。3.2.1立即寻址方式

操作数包含在指令字节中,指令操作码后面字节就是操作数本身,故称为立即数。例:

MOVAL,34H;34H送入AL例:

MOVCX,1000H;1000H送入CX例:

MOVEBX,20031231H;20031231H送入EBX立即数可以是8位或16位数,80386/80486以后微机处理器还可以是32位数。常用来给寄存器赋值。指令功能指令执行3.2.2寄存器寻址方式

例:

INCSI;SI中的内容加1。CPU中某个寄存器的内容就是操作数。例:ADDEAX,ECX;EAX和ECX中的内容相加,和送EAX中,ECX不变例:

MOVAL,BL;BL内容送AL,AL不变例:MOVBX,AX;寄存器AX内容送入寄存器BX,AX值不变

指令功能指令执行3.2.3存储器寻址方式

指令中给出操作数所在存储器地址信息(偏移地址,称之为有效地址EA),而段基地址在默认或用段超越前缀指定的段基址寄存器中;8086有五种存储器寻址方式(1)直接寻址方式(2)寄存器间接寻址方式(3)寄存器相对寻址方式(4)基址变址寻址方式(5)相对基址变址寻址方式(1)直接寻址

有效地址在指令中直接给出;默认段基地址在DS段寄存器,可使用段超越前缀改变例:MOVAX,[2000H];AX←DS:[2000H];指令代码:A10020例:MOVAX,ES:[2000H];AX←ES:[2000H];指令代码:26A10020指令功能指令执行段超越源操作数逻辑地址(2)寄存器间接寻址有效地址在基址寄存器BX、BP或变址寄存器SI、DI中默认的段基地址在DS或SS段寄存器,可使用段超越前缀改变;例:MOVAX,[SI] ;AX←DS:[SI]

BX EA=SI,操作数物理地址=DS*10H+EADI EA=BP,操作数物理地址=SS*10H+EA指令功能指令执行例:MOVBX,1000H;偏移量1000H送入BXMOVEAX,[BX];DS段偏移量为1000H、1001H、

;1002H和1003H单元的内容送EAX(3)寄存器相对寻址有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI,即

有效地址EA=BX/BP/SI/DI+8/16位位移量段基地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变。

操作数物理地址=DS*10H+BX/SI/DI+8/16位位移量

操作数物理地址=SS*10H+BP+8/16位位移量例:MOVAX,[DI+06H];AX←DS:[DI+06H]例:MOVAX,[BP+06H];AX←SS:[BP+06H]指令功能指令执行(3)寄存器相对寻址例:MOVAX,[BX+DATA]例:MOVAL,ES:[SI+5]

例:MOVAX,[SI+100H];将DS*10H+BX+DATA开始连续;两个单元内容送AX;将ES*10H+SI+5单元内容送AL

;设DS=1000H,SI=0。则此指;令把物理地址为10100H和;10101H两单元的内容送入AX(4)基址变址寻址有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成,即段基地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变EA=BX+SI/DI,操作数物理地址=DS*10H+EAEA=BP+SI/DI,操作数物理地址=SS*10H+EA例:MOVAX,[BX+SI];AX←DS:[BX+SI]例:MOVAX,[BP+DI];AX←SS:[BP+DI]例:MOVAX,DS:[BP+DI];AX←DS:[BP+DI]指令功能指令执行(5)相对基址加变址寻址有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和,即有效地址=BX/BP+SI/DI+8/16位位移量段基地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变。例:MOVAX,[BX+SI+06H];AX←DS:[BX+SI+06H]指令功能指令执行与数据有关寻址方式小结在寄存器相对或相对基址变址寻址方式中,位移量可用符号表示:例:MOVAX,[SI+COUNT];COUNT是事先定义的变量或常量(数值)例:MOVAX,[BX+SI+WNUM];WNUM是变量或常量与数据有关的寻址方式共有七种;同一寻址方式可以写成不同的形式:例:MOVAX,[BX][SI];等同MOVAX,[BX+SI]例:MOVAX,COUNT[SI];等同MOVAX,[SI+COUNT]例:MOVAX,WNUM[BX][SI];等同MOVAX,WNUM[BX+SI]

;等同

MOVAX,[BX+SI+WNUM]3.3指令系统

指令系统常用指令有如下6类:

数据传送类指令

算术运算指令

逻辑运算位操作指令

控制转移指令CPU控制指令3.3.1数据传送类指令

按功能可分为五种(掌握):通用数据传送指令:MOV交换指令:XCHG、XLAT

堆栈操作指令:PUSH、POP

地址传送指令:LEA输入/输出指令:IN、OUT(第5章介绍)传送指令把数据从一个位置传送到另一个位置;除标志寄存器传送指令外,均不影响标志位;一、通用数据传送指令MOV

指令格式:MOVOP1,OP2;字节、字、双字间传送功能:将源操作数OP2内容传送(复制)到目的操作数OP1中。常用于对寄存器、存储器赋值,数据暂存等。

例3.1:立即数传送moval,4 ;al←4,字节传送movcx,0ffh ;cx←00ffh,字传送movsi,200h ;si←0200h,字传送mov[di],10ffh ;[di]←10ffh,字传送例3.2:寄存器间传送movax,bx;ax←bx,字传送movbh,al;bh←al,字节传送movds,ax;ds←ax,字传送一、通用数据传送指令MOV例3.3:存储器与寄存器间传送MOVAL,[BX]MOV[DI],ALmovdx,[bp];dx←ss:[bp]moves,[si];es←ds:[si]例3.4:段寄存器与存储器、寄存器间传送mov[si],dsmovax,es;ax←esmovds,ax;ds←ax;后两条语句完成ES到DS的传送一、通用数据传送指令MOVMOV也并非任意传送小结通用寄存器AXBXCXDXBPSPSIDI立即数存储器段寄存器CSDSESSS具体指令格式有:MOVreg/sreg,regMOVreg,sregMOVreg/sreg,memMOVmem,reg/sregMOVreg,immMOVmem,imm其中(以后同)reg:寄存器;mem:存储器;seg:段寄存器;imm:立即数。注:操作结果不影响标志寄存器一、通用数据传送指令MOV非法传送种种两个操作数的类型不一致例如源操作数是字节,而目的操作数是字;或相反。MOVAX,BLMOVAL,DX两个操作数不能都是存储器主存之间直接传送是不允许的。MOV[DI],[SI]段寄存器的操作有一些限制段寄存器属专用寄存器,一般不能对他们进行赋值。一、通用数据传送指令MOV不允许立即数传送给段寄存器MOVDS,100H;非法指令,立即数不能传送段寄存器不允许直接改变CS值MOVCS,[SI]

;不允许使用的指令不允许段寄存器之间的直接数据传送MOVDS,ES;非法指令,不允许段寄存器间传送非法传送种种二、交换类指令--XCHG

问题:请写出AX(AL)和BX(AH),寄存器与存储器间数据的交换。寄存器与寄存器之间互换数据;寄存器与存储器之间互换数据;交换指令格式:XCHG

OP1,OP2

;OP1

OP2功能:把源和目的操作数内容进行互换不能在存储器与存储器之间对换数据;不能在段寄存器之间对换数据。例3.5:寄存器间交换movax,1234hmovbx,5678hxchgax,bxxchgah,al例3.6:寄存器与存储器交换xchgax,[2000h];字交换,同xchg[2000h],axxchgal,[2000h];字节交换,同xchg[2000h],al二、交换类指令XLAT/XLATB通常称查表转换指令XLAT(也称换码指令)问题:查表问题的编程,如求数字字符0--9的ASCII码等换码指令执行前:在主存建立一个字节表格,内含要转换成的目的代码;表格首地址存放于BX,AL存放相对表格首地址的位移量。指令格式:XLAT

;al←ds:[bx+al]功能:从BX指定的缓冲区首地址,AL为位移量的内存单元取一个字节数据送AL换码指令执行后:将AL寄存器的内容转换为目标代码。movbx,100hmoval,03hxlat30h31h32h33h34h35h36h37h38h39h‘0’‘1’‘2’‘3’‘4’‘5’‘6’‘7’‘8’‘9’字符BX=100H例3.7:代码转换三、地址传送类指令

指令格式:LEAreg16/reg32,mem 指令功能:将存储器操作数mem的有效地址传送至指定的16/32位寄存器中。有效地址(EA)传送指令LEA例3.8:获取有效地址movbx,0400hmovsi,3chleabx,[bx+si+0f62h];BX=0400h+003ch+0f62h=139EHLEAESI,[EBX+5];不是获得该单元的物理地址或内容;具有计算功能。四、堆栈操作指令堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段基地址;1234SP栈顶栈底3000HSP2FFEH2FFFH3412有压栈和出栈两种操作,对应PUSH和POP指令;堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定;栈顶是地址较小的一端(低端),栈底不变。四、堆栈操作指令例:pushaxpush[2000h]

设SS=1000H,SP=0200H,则pushax执行后SP=?SS=?;设SS=1000H,SP=0200H,执行push[2000h]:DS*10H+2001H的内容送SS*10H+01FDH单元;

DS*10H+2000H的内容送SS*10H+01FCH单元;例:POPDXPOP[2000H]执行后:DX=?SP=?PUSH功能:先使堆栈指针SP减2/4,然后把一个16/32位操作数存入堆栈顶部。OP2是16/32位立即数、通用寄存器、段寄存器、存储器。POP功能:把栈顶的一个字/双字传送至指定的目的操作数,然后堆栈指针SP加2/4。OP1是16/32位的通用寄存器、段寄存器(CS除外)、存储器。

压栈指令格式:PUSHOP2;OP2为源操作数出栈指令格式:POP OP1;OP1为目的操作数

(1)压栈/出栈指令PUSH/POP四、堆栈操作指令

四、堆栈操作指令堆栈操作的单位是字或双字;字/双字数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节;堆栈常用来临时存放数据传递参数

保存和恢复寄存器例3.9:现场保护恢复pushax;进入子程序后pushbxpushds...popds;返回主程序前popbxpopax小结四、堆栈操作指令例:PUSHAXPUSHBXPOPAXPOPBX堆栈变化情况:已知:SS=1050HSP=0100HAX=4860HBX=1287HSS1050H:0000H00FCH00FDH00FEH00FFHSP0100H1287HAX1287HBX栈底48H60HSPSP12H87H4860H4860HSPSPSPSPSPSP可用栈区MPUSHAXPUSHBXPOPAXPOPBX3.3.2算术运算指令

80X86微处理器提供了基本算术运算指令,其操作数可以是8位、16位、32位有符号和无符号的二进制整数及BCD码加法指令:ADD/ADC/INC

减法指令:

SUB/SBB/DEC/NEG/CMP

乘法指令:

MUL/IMUL

除法指令:

DIV/IDIV

符号扩展指令:

CBW/CWD

十进制调整指令:

DAA/DAS/AAA/AAS

请注意算术运算类指令对标志位的影响;

涉及有符号、无符号数(有符号均为补码)

(1)有符号8位:-128~+127;

(2)有符号16位:-32768~+32767;

(3)无符号8位:0~255;

(4)无符号16位:0~65535;一、加法和减法指令

例3.10:加法运算moval,0fbh

;al=0fbhaddal,07h;al=02hmovbx,1feh;bx=1fehaddal,bl

;al=00h⑴不带进位/借位的加、减法指令moval,0fbh

;al=0fbhsubal,07h;al=0f4h,CF=0movbx,1feh

;bx=1fehsubal,bl

;al=0f6h例3.11:减法运算一、加法和减法指令指令格式:ADDreg/mem,reg/mem/immSUBreg/mem,reg/mem/immADD功能:将源与目的操作数相加,结果送到目的操作数;按结果状态置FR相应标志位。SUB功能:将目的操作数减源操作数,结果送目的操作数;按结果状态置FR相应标志位。注意:源和目的操作数不能同时为存储器。一、加法和减法指令例3.12:双字加法,02344652+f0f0f0f0Hmovax,4652h;ax=4652haddax,0f0f0h;ax=3742h,CF=1movdx,0234h;dx=0234hadcdx,0f0f0h;dx=f325h,CF=0DX.AX=02344652H

+F0F0F0F0H

=F3253742H(2)带进位/借位的加减法指令例3.13:双字减法,02344652–f0f0f0f0Hmovax,4652h;ax=4652hsubax,0f0f0h;ax=5562h,CF=1movdx,0234h;dx=0234hsbbdx,0f0f0h;dx=1143h,CF=1DX.AX=02344652H

-F0F0F0F0H

=11435562H一、加法和减法指令指令格式:ADC reg/mem,reg/mem/immSBB reg/mem,reg/mem/immADC功能:源与目的操作数相加,再加上进位CF位,结果送目的操作数;按结果状态置FR相应标志位SBB功能:将目的操作数减源操作数,再减借位CF位,结果送目的操作数;按结果状态置FR相应标志位。注意:源和目的操作数不能同时为存储器。二、加1/减1指令

例如:INCDIDECSIINCBYTEPTR[SI]

指令格式:INCreg/memDECreg/memINC功能:对操作数加1(增量);不影响进位CF标志,按结果设置FR其他状态标志DEC功能:对操作数减1(减量);不影响进位CF标志,按结果设置FR其他状态标志。

INC和DEC指令都是单操作数指令;主要用于对计数器和地址指针的调整。MOVCX,0FF00H;0FF00HCXNEXT:DECCX

;CX-1CXJNZNEXT;CX0转NEXT

HLT;停机例3.14延时程序三、比较指令CMP

对两个无符号数,根据ZF、CF标志位确定相等和大小。对两个有符号数(A和B,做A-B)大小关系的确定:当OFSF=0时,被减数大于减数(AB);当OFSF=1时,被减数小于减数(AB);

指令格式:

CMPreg/mem,reg/mem/immCMP功能:将目的操作数减源操作数,按结果置FR相应标志位,但结果不回送目的操作数。例3.15:在内存数据段DATA开始的单元中存放了两个8位无符号数,试比较它们的大小,并将大的数送MAX单元分析画流程图;编写代码段四、乘法和除法指令例3.16:乘法运算设AL=FFH,DL=02H,MULDL;AXAL*DLFFH*02H=255*02=510=01FEHAXIMULDL;AXAL*DLFFH*02H=-1*02=-2=FFFEHAX无(有)符号数乘/除法指令格式:四、乘法和除法指令例3.17:除法运算movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=180divbl

;商al=05h=5

;余数ah=7ch=124movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=-76idivbl

;商al=f3h=-13

;余数ah=24h=36四、乘法和除法指令无符号数乘/除法指令格式:

MULreg/mem DIVreg/memMUL功能:无符号字节乘法,AX←AL×reg8/m8;无符号字乘法,DX.AX←AX×reg16/m16DIV功能:字节除,AL←AX÷reg8/m8的商,AH←AX÷reg8/m8的余数;字除,AX←DX.AX÷reg16/m16的商,DX←DX.AX÷reg16/m16的余数MUL源操作数写出,隐含目的操作数AX和DX;若乘积的AH或DX为0,则OF=CF=0;否则OF=CF=1;对其他状态标志没有定义。DIV除数写出,隐含被除数在AX和DX中;对标志没有定义;如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU产生编号为0的除法错内部中断。五、BCD码(十进制数)调整指令

AL清0ALAL+CL调整为十进制数CLCL-1CL=0NYCL10,计数初值

MOVAL,0MOVCL,10NEXT:ADDAL,CL

DAADECCLJNZNEXTHLT程序中将DAA指令去掉,最后AL结果是?;对AL调整为十进制数

;CL0转

NEXT结果AL=55H结束例3.18:编程计算1+2+3+4+…10五、BCD码(十进制数)调整指令

例3.19:压缩BCD(68+28)加法moval,68h;al=68hmovbl,28h

;bl=28haddal,bl

;al=68h+28h=90hdaa

;调整:al=96h例3.20:四位压缩BCD(1234-4612)减法MOVAX,1234HMOVBX,4612HSUBAL,BL

;低两位减34-12=22,CF=0DAS

;对AL调整XCHGAL,AHSBBAL,BH

;高两位减12-46=66,CF=1DAS

;对AL调整XCHGAL,AH五、BCD码(十进制数)调整指令

压缩BCD码就是通常的8421码;用4个二进制位表示一个十进制位,一个字节可表示两个十进制位,即00~99。非压缩BCD码用8个二进制位表示一个十进制位,只用低4位表示一个十进制位0~9,高4位任意,通常为0。有对应加、减、乘、除指令的BCD调整指令,以得到十进制运算结果;分成压缩BCD码和非压缩BCD码调整。8086支持压缩BCD码和非压缩BCD码调整运算。真值8 64二进制编码08H40H压缩BCD码08H64H非压缩BCD码08H0604H五、BCD码(十进制数)调整指令压缩BCD码加法调整指令:ADDAL,reg/mem/imm8DAA ;将和值AL调整为压缩BCD数ADCAL,reg/mem/imm8DAA ;将和值AL调整为压缩BCD数压缩BCD码减法调整指令:SUBAL,reg/mem/imm8DAS;将差值AL调整为压缩BCD数SBBAL,AL,reg/mem/imm8DAS;将差值AL调整为压缩BCD数用DAA/DAS前,先执行以AL为目的操作数的加法/减法指令。DAA和DAS指令对OF标志无定义,按结果影响其他标志。3.3.3逻辑运算80X86提供了丰富的逻辑运算及移位指令,该类指令以二进制位为基本单位进行数据操作并影响标志位。主要有下列指令:(1)逻辑与指令(AND)(2)逻辑或指令(OR)(3)非运算指令(NOT)(4)逻辑异或指令(XOR)

(5)测试指令(TEST)一、逻辑与指令AND例:ASCII码变数字MOVAL,39H ANDAL,0FH

AND功能:对操作数按位执行逻辑与运算,结果送目的操作数;只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。使CF=OF=0,按结果置SF、ZF和PF状态,对AF未定义。使目的操作数某些位保留(和“1”相“与”)或清除(和“0”相“与”),又称为屏蔽某些位;例:将AL中第3位和第7位清零。

MOV AL,0FFH AND AL,77H;77H=01110111B指令格式:ANDreg/mem,reg/mem/imm二、逻辑或指令OR指令格式:ORreg/mem,reg/mem/immOR指令功能:将源和目的操作数按位逻辑或运算,结果送目的操作数;相“或”两位有一位是1,结果是1;否则为0使CF=OF=0,按结果置SF、ZF和PF状态,AF未定义。使目的操作数某些位保留(和“0”相“或”),置1(和“1”相“或”);组合某一特定数;

MOVAL,30HORAL,09;AL=39H清CF(CF=0);

ORAL,AL;AL不变CF=0常用于对操作数某些位置1;

ORAL,80H;AL最高位置1其余位不变三、逻辑异或指令XOR指令格式:XORreg/mem,reg/mem/immXOR功能:将源和目的操作数逻辑异或运算,结果送到目的操作数;相“异或”两位不同,结果是1;否则为0。使CF=OF=0,按结果置SF、ZF和PF状态,对AF未定义常用于使某操作数清零同时进位位清零(CF=0);

XORAL,AL

;AL=0,CF=0使目的操作数中若干位取反(不变位与0异或,取反位与1异或)

XORAL,AL;使AL=00H,CF=0

XORAL,3;3=00000011B,使AL低两位取反,其余不变四、测试指令TEST指令格式:TESTreg/mem,reg/mem/immTEST功能:对源和目的操作数按位做逻辑与运算,结果不送目的操作数;按结果置SF、ZF和PF,CF=OF=0,AF未定义。

TEST通常用于检测一些条件是否满足,但又不希望改变原操作数的情况。例3.21:从4000H开始的单元中有32个有符号字节数,统计出其中负数个数并存入NUM单元。分析问题画流程图;编写程序代码如下:四、测试指令TEST4000H4001H401FHMDS:SINUM

XORDX,DX MOVSI,4000H MOVCX,20HAGAIN:MOVAL,[SI] INCSI

TESTAL,80H JZNEXT INCDXNEXT:DECCX JNZAGAIN MOVNUM,DX HLT五、逻辑非指令NOT指令格式:NOTreg/memNOT功能:将操作数按位取反后再送回reg/mem;按位取反是0变为1、1变为0;不影响标志位。例3.22:逻辑运算moval,45h

;not

al;逻辑非al=0bah标志不变3.3.4串操作指令

80X86串操作指令在操作主存连续区域的数据时,特别好用、因而常用。主要有:(1)串传送指令:MOVSB、MOVSW;(2)串比较指令:CMPSB、CMPSW;(3)串扫描指令:SCASB、SCASW;(4)串装入指令:LODSB、LODSW;(5)串存储指令:STOSB、STOSW;(6)重复前缀:REP

REPZ/REPEREPNZ/REPNE(了解)3.3.4串操作指令串寻址(约定)源操作数用DS:SI寻址,允许段超越:ES:[SI];串数据类型操作数是主存中连续存放的数据区(称数据串);字节串、字串;目的操作数用ES:DI寻址,不允许段超越;执行一次串操作指令,SI和DI自动修改:±1(对于字节串)或±2(对于字串);执行指令CLD指令后,DF=0,地址指针增1或2;执行指令STD指令后,DF=1,地址指针减1或2;DS:SIES:DI源数据串目的数据串一、串传送指令MOVSB/WDS:SI(2000H:1200H)ES:DI(6000H:4000H)源串目的串例3.23:将源串首地址为2000H:1200H开始的100个字节传送到首地址为6000H:4000H开始的内存单元中。一、串传送指令MOV例3.23a字节串传送

MOVSI,1200H

MOVDI,4000HMOVCX,100;cx←字节串长度,循环次数

CLD;置DF=0,地址增加again:MOVSB;传送一个字节

DECCX;cx←cx–1JNZagain;判cx=0?,不为0,转again处执行,否;则执行下一条指令

HLT;停机

MOVSI,12000H

MOVDI,4000H

MOVCX,50

;cx←字串长度,循环次数

CLD

;置DF=0,地址增加again:

MOVSW

;传送一个字

DECCX

;循环次数减1

JNZagain

HLT例3.23b字串传送一、串传送指令MOVSB/W把字节或字操作数从主存的源地址传送至目的地址;MOVSB

;字节串传送:ES:[DI]←DS:[SI];SI←SI±1,DI←DI±1MOVSW

;字串传送:ES:[DI]←DS:[SI];SI←SI±2,DI←DI±2DS:SIES:DI源串目的串二、串比较指令CMPSB/SW例3.24:分别从SOURCE和DEST开始存放两个串长为100个字节的字符串。试比较两个字符串是否相同,若全部相同,则使BX=0;若不相同,则将源串中第一个不相同字符的偏移地址送BX,不相同字符送AL中。

CLD;DF=1,为增量方式 LEASI,SOURCE LEADI,DEST MOVCX,100NEXT:CMPSB JNZSTOP DECCX JNZNEXT JNZNEXT MOVBX,00H JMPDONESTOP:DECSI MOVBX,SI MOVAL,[BX]DONE:HLT按结果状态置F标志位,两操作数的值不变。CMPSB

;DS:[SI]-ES:[DI]

;SI←SI±1,DI←DI±1CMPSW

;DS:[SI]-ES:[DI]

;SI←SI±2,DI←DI±2二、串比较指令CMPSB/SWDS:SIES:DI源串目的串三、重复前缀串操作指令前加一个重复前缀,实现串操作重复执行。重复前缀有:无条件重复前缀REP,通常与MOVS、STOS(和LODS)指令联用;条件重复前缀REPZ/REPE和REPNZ/REPNE,通常与CMPS和SCAS指令联用;(了解)REP重复前缀指令具体有:REPMOVSB REPMOVSW

REPSTOSBREPSTOSW REPLODSBREPLODSWREP

;串指令执行一次,CX减1;重复到CX=0,结束例3.25:将源串首地址为2000H:1200H开始的100个字节传送到首地址为6000H:4000H开始的内存单元中。三、重复前缀

MOVSI,1200H

MOVDI,4000H

MOVCX,100

;cx←字节串长度,循环次数

CLD;置DF=0,地址增加

REPMOVSB

;传送一个字节HLT;停机

MOVCX,50

;cx←字串长度,循环次数

REPMOVSW

;传送一个字3.3.5控制转移类指令

(1)无条件转移JMP80X86指令系统的控制转移类指令分五类,实现分支、循环、过程等程序结构。重点掌握:(5)中断响应和返回指令INTn/IRET

(2)条件转移指令JCC(3)循环控制指令LOOP(4)调用和返回指令CALL/RET

此类指令通过改变IP(和CS)值,改变程序执行顺序。一般了解:LOOPZ/LOOPNZINTO一、无条件转移指令JMP

操作数label是要转移到的目标地址(目的地址、转移地址)JMPlabel

;程序转向label标号指定的地址用标号表达用寄存器或存储器操作数表达JMP指令分成4种类型:⑴段内转移、直接寻址⑵段间转移、直接寻址⑶段内转移、间接寻址⑷段间转移、间接寻址一、无条件转移指令JMP段内转移——近转移(nearptr)在当前代码段64KB范围内转移CS不变,IP(偏移地址)变代码段1代码段2段内转移——短转移(short)在段内-128~+127范围的转移段间转移——远转移(farptr)从当前代码段跳到另一代码段,可在1MB范围CS(段地址)和IP(偏移地址)都变

实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移

程序员可用操作符short、nearptr或farptr指定一、无条件转移指令JMP例3.26

MOVAX,BX MOVCX,50

JMPEXIT ANDCL,0FH …… ……EXIT:ORCH,7FHMOV[2000H],CHHLT一、无条件转移指令JMP(1)段内直接转移指令格式:JMPLABEL;无条件转到LABEL处执行其中,LABEL是一个标号,也称为符号地址,它表示转移的目的地。操作码8位位移量

0000:2000H

0000:2002H

(CS:IP)

0000:2006H

(目的地址NEXT)JMP指令地址当前指令地址例:JMPSHORTNEXT;直接短转移位移量是目标指令的偏移地址减JMP指令的下一条指令的偏移地址;直接短转移:-128~+127一、无条件转移指令JMP(1)段内直接转移例:

JMP[NEARPTR]NEXT;近转移操作:IPIP+16位位移量;位移量用16位补码表示操作码位移量低位位移量高位0000:2000H(JMP指令地址)

0000:2250H

(目的地址 NEXT)3字节位移量是目标指令的偏移地址减JMP指令的下一条指令的偏移地址;近转移:-32768~+32767一、无条件转移指令JMP(2)段间直接转移指令格式:JMPFARPTRLABEL功能:标号LABEL所在段的偏移地址和段基地址分别放在指令操作码后,指令执行时前两个字节装入(E)IP,后两个字节装入CS。例:jmpfarptrothseg操作:IP标号othseg的偏移地址

CS标号othseg的段地址CS:IP3000:1000HCS:IP0000:2000H当前指令地址跨段转移操作码00H10H

00H30H5字节指令段间转移CS、IP内容均改变othseg一、无条件转移指令JMP(3)段内间接转移指令格式:JMPregJMPWORDPTRmem功能:将16或32位寄存器内容或各种内存寻址方式得到的有效地址EA中的内容写入IP或EIP中,CS不变。内存物理地址32000H32001H0130代码段数据段0000:2000H目的地址

0000:3001H操作码例:已知DS=3000HBX=2000H

(32000H)=01H

(32001H)=30H执行:JMPWORDPTR[BX]过程:物理地址=DS*16+BX=32000HIP(32000H)结果:

IP=3001H一、无条件转移指令JMP(4)段间间接转移指令格式:JMPDWORDPTRmem

;IP←[mem],CS←[mem+2]JMPFWORDPTRmem;EIP←[mem],CS←[mem+4]功能:目标地址存放在主存连续两/三个字单元中,(E)IP=低位字/双字,CS=高位字movwordptr[bx],0movwordptr[bx+2],1500hJMPdwordptr[bx]

;转移到1500h:0二、条件转移指令JCC指令格式:JccOP1

;条件满足转到OP1;条件不满足,执行jcc下一条指令段内短转移(short),转移范围是距当前IP地址-128~+127个单元;jcc指令不影响标志,共有20条指令:(1)判断单个标志位状态(2)比较无符号数大小(3)比较有符号数大小二、条件转移指令JCC(1)以状态标志为依据的条件转移指令指令助记符测试条件指令功能JCOP1 CF=1有进位/借位JNCOP1CF=0无进位/无借位JZ/JEOP1ZF=1结果为零JNZ/JNEOP1ZF=0结果不为零JSOP1SF=1符号为负JNSOP1SF=0符号为正JOOP1OF=1溢出JNOOP1OF=0无溢出JP/JPEOP1PF=1偶数个1JNP/JPOOP1PF=0奇数个1可测标志位有:CF、ZF、SF、OF、PF二、条件转移指令JCC(2)以无符号数比较结果为依据的条件转移指令利用CF确定大小、利用ZF标志确定相等(Equal)两数的大小分成4种关系(CMPA,B):(1)A>B:JNBE/JAOP1;大于,转OP1(2)A≥B:JNB/JAE/JNCOP1;大于等于,转OP1(3)A<B:JB/JNAE/JCOP1;小于,转OP1(4)AB:JBE/JNAOP1;小于等于,转OP1(3)以有符号数比较结果为依据的条件转移指令两个有符号数大小分成4种关系(CMPA,B):(1)A>B:JNLE/JG

OP1;大于,转OP1(2)A≥B:JNL/JGE

OP1;大于等于,转OP1(3)A<B:JL/JNGEOP1;小于,转OP1(4)AB:JLE/JNG OP1;小于等于,转OP1二、条件转移指令JCC无符号数改为

JAGREAT例3.27:将内存(2040H)和(2041H)中的大数送(2042H)AL(2040H)AL-(2041H)AL>(2041H)(2042H)ALNYMOVAL,[2040H]CMPAL,[2041H]JGGREATMOVAL,[2041H]GREAT:MOV[2042H],AL HLTGREATAL(2041H)二、条件转移指令JCC例3.28:有10个无符号字节数据顺序存放在以2000H单元为首地址的数据存储区中,编写程序找出其中最大数,并将其存入2200H单元。三、循环控制指令先置循环次数于CX寄存器中,CX计数器自动减1,实现计数循环的程序结构;LOOPOP1

;(E)CX←(E)CX-1

;若(E)CX≠0,转OP1处执行;若(E)CX=0,结束循环,执行LOOP下一条短转移,OP1在该循环控制指令的下一条指令的-128~+127范围内;对标志位不影响。三、循环控制指令例3.29:统计某字符串中空格个数XORDX,DXMOVSI,2000HMOVCX,20AGAIN:MOVAL,[SI]INCSICMPAL,’’JNZNEXT;结果不等于零转NEXTINCDXNEXT:LOOPAGAINMOVNUM,DXHLTDECCXJNZAGAIN四、子程序调用和返回指令子程序调用指令格式:CALLPROC;保护断点并转到PROC处执行段内调用:将子程序返回地址(CALL指令的下一条指令首地址,也称断点地址)存入堆栈中,只改变IP值。SP←SP-1,(SP)←IP的高8位;SP←SP-1,(SP)←IP的低8位;段间调用:将子程序返回地址存入堆栈中,改变CS、IP值。

SP←SP-1,(SP)←CS的高8位;SP←SP-1,(SP)←CS的低8位;SP←SP-1,(SP)←IP的高8位;SP←SP-1,(SP)←IP的低8位;四、子程序调用和返回指令返回指令:过程中至少有一条返回指令RET,不带操作数。指令格式:RET;无参数段内、段间返回操作:弹出CALL指令压入堆栈的返回地址段内返回——出栈偏移地址IPIP←SS:[SP],SP←SP+2段间返回——出栈偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2四、子程序调用和返回指令

(1)段内直接调用有两种格式:CALLPROC

CALLFARPTRPROC操作:(1)

将子程序返回地址(即主程序中CALL指令的下一条指令首地址,也称断点地址)存入堆栈中。

SPSP–1,(SP)IP的高8位,

SPSP–1,(SP)IP的低8位;

(2)IPIP+D16(16位偏移量),转到子程序入口处执行子程序,PROC是子程序入口地址符号(标号)例:主程序中执行段内直接调用子程序,设SS=4000H CS:IP 1000:2540 CALLPROC1 1000:3000PROC1:MOVAL,D

温馨提示

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

评论

0/150

提交评论