汇编语言:第3章80x86的指令系统和寻址方式I_第1页
汇编语言:第3章80x86的指令系统和寻址方式I_第2页
汇编语言:第3章80x86的指令系统和寻址方式I_第3页
汇编语言:第3章80x86的指令系统和寻址方式I_第4页
汇编语言:第3章80x86的指令系统和寻址方式I_第5页
已阅读5页,还剩197页未读 继续免费阅读

下载本文档

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

文档简介

第3章

80x86的指令系统和寻址方式

本章重点(1)

能够正确使用以下各类指令:1)数据传送指令;2)算术运算指令;3)逻辑运算和移位指令;4)串处理指令;5)控制转移指令;6)处理机控制指令。本章重点(2)能够根据不同的寻址方式掌握对源操作数和目的操作数的物理地址的确定重点掌握算术运算和逻辑运算指令执行后对状态标志SF,ZF,CF,OF位的置位和复位的条件能够正确分析给定指令组所完成的功能和运行结果,并能灵活选用各种指令完成指定的操作学习方法

学习时不应单纯地对各类指令进行死记硬背,而是应该根据其记忆符的英文含义和各类指令的不同功能来灵活掌握重点掌握8086/8088的寻址方式和指令系统然后推广到80386及后继机型的情形,比较对照0、指令系统概述机器指令以二进制代码(机器码)表示指令直接,不易读懂汇编指令以符号形式表示指令易读,需要翻译(汇编)与CPU相关指令系统指令组成:计算机中的指令由操作码字段和操作数字段两部分组成指令的格式:操作码操作数1…操作数n指令成分操作码(操作的性质)表示指令应完成的具体操作以助记符的形式表示操作数(操作的对象)表示指令的操作对象(参与操作的对象)源操作数、目的操作数操作数字段指令分类:(按操作数分)单操作数指令:OPRDEST双操作数指令:OPRDEST,SRC三操作数指令:OPRDEST,SRC,SRC1无操作数:OPR

(隐含操作数)指令的操作码字段和操作数字段的表示每个操作用确定的二进制代码表示操作数字段:情况很多,也很复杂汇编用助记符表示操作码,用符号或符号地址表操作数指令、程序初步-1从键盘输入一个字符,然后从屏幕输出CODESEGMENTASSUMECS:CODESTART:MOVAH,1INT21H

MOVDL,ALMOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART指令、程序初步-2从键盘输入2个字符,存放于字节变量A、B中,然后从屏幕输出这2字符。DatareasegmentADB?BDB?datareaendscodesegment;定义代码段

assumeCS:code,DS:datareastart:MOVAX,datareaMOVDS,AXMOVAH,1INT21HMOVA,ALMOVAH,1INT21HMOVB,ALMOVAH,2MOVDL,AINT21HMOVDL,BINT21HMOVAH,4CHINT21HCodeENDSENDstart指令、程序初步-3从键盘输入2个一位数,求他们的和,并存放在变量sum中。DatareasegmentsumDB?datareaendscodesegment;定义代码段

assumeCS:code,DS:datareastart:MOVAX,datareaMOVDS,AXMOVAH,1INT21HSUBAL,30H

MOVBL,ALMOVAH,1INT21HSUBAL,30HADDAL,BLMOVSUM,ALMOVAH,4CHINT21HCodeENDSENDstart例、字符串打印-C++实现在数据区中有一个内容是“Shanghai”的字符串str,请编程在屏幕上输出#include<iostream>usingnamespacestd;charstr[]="Shanghai";intA=0x97985134;intmain(){

int

bx,cx;

cx=8;

bx=0;

do{

cout<<str[bx];

bx++;

cx--; }while(cx!=0);

cout<<endl; return0;}C++实现字符串打印-汇编实现Datareasegment

strdb'Shanghai$'ADW5134H,9798Hdatareaendscodesegment;定义代码段

assumeCS:code,DS:datareastart:MOVAX,datarea;数据段

MOVDS,AX;地址装入DSMOVCX,8MOVBX,0

again:MOVAH,2MOVDL,str[BX]INT21HINCBXDECCXJNZagainMOVAH,4CHINT21HCodeENDSENDSTART程序中涉及的操作数与寻址AX与datarea:传入地址DS与AX:传入数据CX与8:传入数据BX与0:传入数据AH与2::传入数据DL与str[BX]:传入数据BX:自增CX:自减Again:标号地址AH与4CH:传入数据3.1.1与数据有关的寻址方式8086/80286系列立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址80386及后继机型比例变址寻址基址比例变址寻址相对基址比例变址寻址

3.180x86的寻址方式

寻址方式及操作数类型寻找指令中所需操作数的方法所需的操作数立即数操作数寄存器操作数存储器操作数输入/输出端口操作数1、立即寻址操作数:直接存放在指令中,紧跟在操作码之后,作为指令的一部分存放在代码段里8086/8088:立即数是8或16位常数80386:立即数可以是8或32位常数仅用作源操作数的寻址立即数的高位字(节)放在高地址中,低位字(节)放在低地址中立即寻址举例MOVAL,5==>(AL)=05HMOVCX,2A50H==>(CX)=3064H

即(CX)=(CH,CL)=(30H,64H)MOVEAX,12345678H==>(EAX)=12345678HMOVCX,8被编译成二进制代码B90800MOVAH,2被编译成二进制代码B402MOVAH,4CH被编译成二进制代码B44CMOVCX,2A50H注意下列指令错MOVAH,500MOV50,AL不能直接给段寄存器和标志寄存器赋予立即数。下面的指令是错误的:

MOVDS,1250H2.寄存器寻址指令指定寄存器号/名称,操作数在寄存器中对16位操作数:寄存器用AX、BX、CX、DX、SI、DI、SP和BP对8位操作数:寄存器用AL、AH、BL、BH、CL、CH、DL和DH对32位操作数:寄存器用EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP寄存器号操作数从寄存器取寄存器寄存器寻址举例设(AX)=3064H,(BX)=1234H,执行MOVAX,BX==>(AX)=1234H,(BX)保持不变设(ECX)=0123454H,(EBX)=12349876H,执行

MOVECX,EBX==>(ECX)=12349876H,(EBX)保持不变注意寄存器寻址时要弄清针对哪个寄存器而言源、目的寄存器是什么?MOVAL,BX对吗?MOVAX,BH对吗?MOVAL,AH对吗?源寄存器和目的寄存器的位数必须一致。3.直接寻址所需的操作数在存储器中。指令中直接给出操作数所在单元的有效地址(段内偏移地址),它放在操作码之后有效地址EA:操作数的偏移地址EA操作数段基地址+存储器操作数:(1)如操作数在数据段中,则:操作数物理地址=16d

(DS)+EA(2)如数据存放在数据段以外的其他段中,此时应在指令中指定段跨越前缀直接寻址举例如MOVDX,A被编译成8B1609

又如右图,如(DS)=3000H执行MOVAX,[2000H]结果为:(AX)=3050H符号地址与段跨越前缀以下两指令等效MOVAX,VALUEMOVAX,[VALUE]当VALUE在附加段中,应指定段跨越前缀:

MOVAX,ES:VALUE或MOVAX,ES:[VALUE]规定:双操作数指令除立即方式外必须有一个操作数使用寄存器方式。MOVVAL1,VAL2错程序举例e504cmpS.asm所需的操作数在存储器中。操作数所在单元的有效地址存放在寄存器中,指令中给出寄存器的名称仅限于BX、BP、SI、DI-基址/变址寄存器中4.寄存器间接寻址EA操作数段基地址+存储器寄存器MOVAX,[BX]例:如果(DS)=2000H,(BX)=1000H,执行MOVAX,[BX]则因物理地址=20000+1000=21000H,结果为:(AX)=50A0H寄存器间接寻址(续)对16位寻址,寄存器可为BX、BP、SI、DI对32位寻址,寄存器可为:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI注意用相对应的默认段寄存器寄存器间接寻址物理地址(1)16位寄存器:指令如MOVAX,[SI]指令中指定的寄存器BX、SI、DI,则操作数在现行数据段中,用段寄存器DS,

物理地址=16dx(DS)十(BX)或物理地址=16dx(DS)十(SI)或物理地址=16dx(DS)十(DI)指令中指定BP寄存器,操作数在堆栈段中,用段寄存器SS,物理地址=16dx(SS)十(BP)操作数的物理地址求法(2)32位寄存器(应采用保护模式求物理地址)例:设(EBX)=56781021H,(567A1021H)=87654321H,假如执行MOVEAX,[EBX],用数据段段DS,如求出物理地址=567A1021H,则结果为:(EAX)=87654321H物理地址=16dx段基地址+(寄存器)练习如果(DS)=4000H,(SS)=3000H,(BP)=2000H,(32000H)=1234H,(42000H)=5678H,(ES)=5000H,执行MOVAX,[BP]结果为:(AX)=?注:指令中也可指定段跨越前缀来取得其他段中的数据。如:MOVAX,ES:[BX]5.寄存器相对寻址所需的操作数在存储器中操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位、16位、32位位移量之和地址操作数段基地址+存储器寄存器位移量+EA例3.9MOVAX,COUNT[SI]下列两指令等价:MOVAX,COUNT[SI]MOVAX,[COUNT+SI]例:COUNT=3000H,设(DS)=3000H,(SI)=2000H,这里COUNT为16位位移量的符号地址。对指令MOVAX,COUNT[SI]源操作数物理地址30000+2000+3000=35000H执行结果是:(AX)=1234HMOVAX,COUNT[SI]执行图8086/8088:有效地址计算(1)8086/8088物理地址计算(1)8086/8088:物理地址=16dx(DS)+(BX)+8位位移量或(SI)或16位位移量或(DI)或物理地址=16dx(SS)+(BP)+8位位移量或16位位移量有效地址、物理地址计算(2)80386-用保护模式或虚拟模式例:MOVEAX,TABLE[EBP]设数据段基地址3000H,堆栈段基地址=1000H,TABLE=30000H,(20041234H)=98765432H,(EBP)=20001234H,物理地址=?执行结果=?物理地址=1000*16D+(EBP)+TABLE=10000+20001234+30000=20041234H执行结果是:(EAX)=98765432H6.基址变址寻址所需的操作数在存储器中。操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和两个寄存器均由段与寄存器间的默认关系确定例3.10:

MOVAX,[BX][DI](也可写成:MOVAX,[BX+DI])基址变址寻址(图例)基址值操作数段基地址+存储器基址寄存器变址值+变址寄存器EA基址变址寻址物理地址8086/8088基址寄存器为BX时,段寄存器使用DS基址寄存器为BP时,段寄存器则用SS物理地址=16d

(DS)+(BX)+(SI)

或(DI)物理地址=16d

(SS)+(BP)+(SI)

或(DI)这种寻址方式同样适用于数组或表格处理MOVAX,[BX][DI]操作图设(DS)=2100H,(BX)=0158H,(DI)=10A5H基址变址寻址(续)段跨越前缀时的格式为:MOVAX,ES:[BX][SI]32位寻址:例:MOVEAX,[EBX][EDI]或有段跨越前缀的形式7.相对基址变址寻址操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和一个位移量之和基址值操作数段基地址+存储器基址寄存器变址值+变址寄存器EA位移量相对基址变址寻址物理地址例3.11MOVAX,MASK[BX][SI]8086/8088:当基址寄存器为BX时,使用DS为段寄存器当基址寄存器为BP时,使用SS为段寄存器物理地址=16d

(DS)+(BX)+(SI)+8位位移量或(DI)或16位位移量或物理地址=16d

(SS)+(BP)+(SI)+8位位移量或(DI)或16位位移量

例3.11MOVAX,MASK[BX][SI]设(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,小结16/32位寻址时有效地址四种的组成:位移量、基址寄存器、变址寄存器、比例因子默认段与寄存器的选择8086有效地址的求法:基址+变址+位移量物理地址的求法:掌握16位寻址8.比例变址寻址有效地址:是一个变址寄存器的内容乘以指令中指定的比例因子和位移量之和(32位)(变址x比例因子)+位移量因子为2、4、8例:MOVEAX,COUNT[ESI*4],(ESI)=3;例:MOVECX,TABLE[EDX*2];(EDX)=2;9.基址比例变址寻址有效地址:是一个基址寄存器和一个变址寄存器的内容乘以指令中指定的比例因子之和基址+(变址x比例因子)例:MOVEAX,[EBX][EDI*4]10.相对基址比例变址寻址有效地址:是一个基址寄存器和一个变址寄存器的内容乘以指令中指定的比例因子和位移量之和基址+(变址x比例因子)+位移量例:MOVEAX,TABLE[EBX][EDI*4]寻址方式总结16/32位寻址方式有效地址组成:位移量、基址寄存器、变址寄存器、比例因子有效地址:

EA=基址值+(变址值*比例因子)+位移量物理地址求法:(段基地址)*16d+EA注意寄存器的对应使用数据定义及存储器分配控制转移指令初步循环程序的结构形式条件转移指令JZ(或JE)结果为零(或相等),条件ZF=1,则跳转。格式:JZOPR(或JEOPR)JNZ(或JNE)结果不为零(或不相等),ZF=0,则转移。格式:JNZOPR(或JNEOPR)JS结果为负,SF=l,则转移格式:JSOPRJNS结果为正,SF=0,则转移格式:JNSOPRJO溢出,OF=1,则转移格式:JOOPRJNO不溢出则转移格式:JNOOPR测试条件:OF=0JP(或JPE)奇偶位为1则转移。格式:JP(或JPE)OPR测试条件:PF=lJNP(或JPO)奇偶位为0则转移。格式:JNP(或JPO)OPR测试条件:PF=0JB(或JNAE,JC)低于;或者不高于或等于;或进位为1则转移。格式:JB(或JNAE,或JC)OPR测试条件:CF=lJNB(或JAE,JNC)不低于,或者高于或等于,或进位为零则转移。格式:JNB(或JAE,或JNC)OPR测试条件:CF=0按带符号数比较结果转移JL(或JNGE)小于,或者不大于或者等于则转移。格式:JL(或JNGE)OPR测试条件:SF

OF=1JNL(或JGE)不小于,或者大于或等于则转移。格式:JNL(或JGE)OPR测试条件,SF

OF=0JLE(或JNG)小于或等于,或者不大于则转移。格式:JLE(或JNG)OPR测试条件,(SF

OF)∨ZF=1JNLE(或JG)不小于或等于,或者大于则转移。格式:JNLE(或JG)OPR测试条件,(SF

OF)∨ZF=0举例例1:求数据区中变量为array的n个字节数据的和,并把和存放于sum中。例2:输出数据区中一个字符串“Hello,world!”,用dos功能调用2.3.1.2与转移地址有关的

寻址方式

段内直接寻址段内间接寻址段间直接寻址确定一条指令的地址段间间接寻址这几组指令主要是关于指令的跳转注:变动的是IP和CS

但可能要通过已介绍的寻址方式求IP汇编的子程序简单介绍主程序:为完成某一总体功能或任务而编制的程序子程序:仅完成部分功能又可被多次调用的程序子程序(即过程)定义:

procedure_namePROCfar;或near

子程序体

RET;子程序返回

procedure_nameENDP代码段的初步认识CodesegmentassumeCS:codemainPROCFARStart:…Again:……JNZagain……

RETmainENDPCodeendsENDstart同一代码段(1)同一代码段(2)Code1segmentassumeCS:codemainPROCFARStart:……JMPHERE…HERE:……

RETmainENDPCode1endsENDstartCode2segmentassumeCS:codemainPROCFARStart:…JMPNEXT…

RETmainENDPSubpPROCnearNEXT:…

RETSubpENDPCode2endsENDstart不同代码段Code1segmentassumeCS:codemainPROCFARStart:…JMPFARPTRNEXT

…JMPhere

RETmainENDPSubpPROCnearHere:…

RETSubpENDPCode1endsCode2segmentassumeCS:codemainPROCFARbegin:…NEXT:……

RETmainENDPCode2endsENDstart转移分类

转移分类:条件转移、无条件转移条件转移指令均是段内转移;无条件转移可实现段内转移与段间转移段内转移:在同一代码段范围内转移,只需改变IP内容,CS不变段间转移:从当前代码段转移到另一个代码段去执行程序,IP、CS均变跳转示例JMP目标跳转的几个例子JMPSHORTADDR1JMPNEARPTRADDR2JMPTABLE[BX]JMPFARPTRADDR3JMPDWORDPTR[AGAIN+BX]JMPBXJMP[BX+DI]1.段内直接寻址目标地址的位移量在指令中转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和IP值IP寄存器位移量+EAIP寄存器JMPSHORTNEW_ADDR如当前(IP)=3000H,NEW_ADDR=3050H则经编译后确定位移量=50H,指令中给出转向的有效地址=3050H短跳转、近跳转

段内直接短转移:位移量8位-128--+12780386也可8位和32位加操作符SHORT段内直接近转移:位移量16位-32768--+3276780386也可8位和32位加操作符NEARPTR近跳转例:JMPNEARPTRNEW_ADDR位移量计算同前注:80386-代码段的偏移地址放在EIP中段内直接寻址是一种相对寻址方式NEAR表示在同一段内转移,位移量在32768~32767字节范围

注意:这种寻址方式适用于条件转移及无条件转移指令。近跳转中,NEARPTR可缺省。条件转移指令只能使用段内直接寻址的8位位移量,

段内直接寻址方式--举例

1060:000DEB04JMPSHORTNEXTIP当前值→1060:000F……

1060:0011……

1060:00130207NEXT:ADDAL,[BX]

CPU在执行JMP指令时,IP指向了下一条指令,其值为000F,JMPSHORTNEXT指令的机器语言为EB04,EB为操作码,04为位移量,所以转向的有效地址应为:

000F+0004=00132.段内间接寻址例:

JMPBXJMPWORDPTR[BP+TABLE]注:WORDPTR说明所取得的转向地址是一个16位有效地址在寄存器中转向的目标地址在存储器中寄存器值寄存器名称EAIP寄存器或存储器单元转移的物理地址计算公式:

物理地址=16d

(CS)+EA例:假设位移量TABLE的内容=20A1H,(232F7H)=3280H,(264E5H)=2450H,(DS)=2000H,(BX)=1256H,(SI)=528FH;对指令

JMPWORDPTRBXJMPWORDPTR[TABLE+BX]JMP[BX][SI]JMPSHORTTABLE

求各指令转向的(IP)=?注意段内转移(直接或间接):程序仍在同一段内跳转:

CS不变,IP修改。3.段间直接寻址目标地址在指令中指令中直接提供了转向段地址和偏移地址例:JMPFARPTRNEW_ROUTINT偏移地址段地址IP寄存器CS寄存器指令段间直接转移操作方法段间转移,CS和IP都要更新,新CS和新IP由指令操作码之后的连续两个字提供OPIPCS用段间转移的操作符FARPTRFAR表示转移距离超过±32K字节,或是在不同段之间转移。4.段间间接寻址目标地址存放在存储器中指令形式:

JMPDWORDPTR[SI]

CALLDWORDPTRarray[BX+SI]转移方法用存储器中的第一个字的内容取代(IP)用存储器中的第二个字的内容取代(CS)偏移地址段地址IP寄存器CS寄存器存储器求物理地址注意两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的

例子段间间接寻址用双字操作符DWORDPTRR,段间转移转向地址需取双字例:JMPDWORDPTRTABLE[SI]例:JMPDWORDPTRES:TABLE[SI]例:JMPDWORDPTR[SP]例:JMPDWORDPTRARRAY注意:与JMPFARPTRARRAY的区别练习指出下列个指令中源操作数的寻址方式

1)SUBAX,[BX]2)ADDAX,BX3)MOVCL,BUFFERR4)DECWORDPTR[SI+VAL]5)CMPBP,80H6)ORDX,BUF[BX+SI]7)JMPNEARPTRADDR18)JMPTABLE[BX]9)JMPFARPTRADDR21O)JMPDWORDPTR[AGAIN+BX]指令的执行时间一条指令的执行时间是取指令、取操作数、执行指令及传送结果各个阶段所需时间的总和指令的基本执行时间因指令的不同而异当需要访问存储器取得操作数时还需要考虑计算有效地址EA所需要的时间机器语言指令的组成

段前缀、操作码、操作数、字/字节、寄存器…信息段前缀字节(8位),3、4位(SEG)分别表示4个段前缀,其它位表示段前缀标志

SEGPIXOPCODEMODEData/DispDataDataData/Disp段前缀操作码寻址方式数据/偏移量数据/偏移量数据数据指令的长度为1~6个字节机器语言指令的组成操作码字节:一个字节,或加下一个字节的3位。高6位是操作码,它来自于机器指令表寻址方式字节:第二个字节表示寻址方式及有无位移量,mod域与r/m域组合,表示指令的另一个寻址方式Mod=00存储器寻址,无偏移量

01存储器寻址,8位偏移量

10存储器寻址,16位偏移量

11寄存器寻址modregr/m233MOVSP,BX指令编码MOVWordptr[BX+2100H],0FA50H3.3指令系统指令系统可分为6组:数据传送指令算术指令逻辑指令串处理指令控制转移指令处理机控制指令3.3.1数据传送指令通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送指令类型转换指令数据传送指令字传送/字节传送寄存器←→寄存器寄存器←→存储器累加器←→I/O端口除了SAHF/POPF外,均不影响FLAGS1.通用数据传送指令MOV传送MOVSX、MOVZXPUSH进栈PUSHA、PUSHADPOP出栈POPA、POPADXCHG交换MOV传送指令格式为:MOVDST,SRC

执行操作,(DST)

(SRC)

其中DST表示目的操作数,SRC表示源操作数MOV指令不影响标志位。MOV指令传送方式MOV指令的机器语言的7种格式MOVmem/regl,mem/reg2;(mem,mem)错MOVreg,dataMOVac,mem

Mov

mem,acMOVsegreg,mem/reg

MOVmem/reg,segreg

MOVmem/reg,dataMem:存储器,reg:寄存器,ac:累加器Data:数据,segreg:段寄存器MOV规则立即数不能作目的操作数DEST立即数不能传至段寄存器存储器之间不能交互(双操作数时)(串除外),即:不允许在两个存储单元之间直接传送数据。段寄存器之间不能交互CS不能作为目的操作数DESTIP不能参与传送DEST和SRC的类型必须一致注意错误指令MOVDS,32543DMOVDS,[32543H]MOVDS,DATA;如DATA为段名注意:如DATA为变量名或标号地址,则指令MOVDS,DATA是正确的MOVCS,AXMOVSS,DSMOV[SI],TABLEMOV举例

例MOVAX,DATA1MOVAX,DXMOVSI,[DI]MOVAX,-32543DMOVDS,BXMOVDATA,DSMOVAX,DSMOVAX,CSMOVSX--符号扩展传送MOVSXDST,SRC执行操作,(DST)

符号扩展(SRC)SRC的位数比DST小符号扩展方法:按SRC的最高位定最高位1,则扩展位全1;最高位0,则扩展位全0不影响标志位MOVZX--零扩展传送MOVZXDST,SRC执行操作,(DST)

零扩展(SRC)扩展方法:高位扩零不影响标志位例设(AL)=96H,(BH)=7AH分别执行下列指令后,求CX内容MOVCX,AL;错MOVSXCX,ALMOVZXCX,ALMOVCX,BH;错MOVSXCX,BHMOVZXCX,BHPUSH/POP字操作,针对栈FILO16位操作数(8086)通用寄存器段寄存器(CS不能用于POP)存储器SP指向栈顶底部高地址/顶部低地址PUSH进栈指令格式为PUSHSRC执行操作:16位:

(SP)

(SP)-2

((SP)+1,(SP))

(SRC)32位:

(ESP)

(ESP)-4

((ESP)+3,(ESP)+2,(ESP)+1,(ESP))

(SRC)POP出栈指令格式为

POPDST执行操作16位:(DST)

((SP)+1,(SP))

(SP)

(SP)+232位:

(DST)

((SP)+3,(SP)+2,(SP)+1,(SP))(SP)

(SP)+4例例1:设(SP)=3015H,(AX)=2107H求执行指令PUSHAX后,AX及SP的值例2:设(SP)=3015H,(AX)=1234H求执行指令POPAX后,AX及SP的值PUSHAX执行情况301530153013POPAX执行情况301530153017注意SP的内容在任何时候都指向当前的栈顶堆栈的存取必须以字为单位(16位机)、用SP;或以双字为单位(32位机)、用ESP这两条堆栈指令不影响标志位POP指令不允许用CS寄存器,POPCS错286机型起,PUSH45H成立,但程序中需指明,如.286或.386等其他PUSH、POPPUSHA:压入8个16位寄存器内容到栈PUSHAD:压入8个32位寄存器内容到栈POPA:从栈弹出8个数据到8个16位寄存器POPAD:从栈弹出8个数据到8个32位寄存器注意压入、弹出次序,及SP变化AXCXDXBXSPBPSIDIXCHG交换指令格式为

XCHGOPRl,OPR2执行操作:(OPRG1)←→(OPR2)8位/16位操作数交换:寄存器←→寄存器;寄存器←→存储器段寄存器不能参与OPRl、OPR2至少一个是寄存器练习分析下面程序段,回答指定问题

MOVAX,O123HMOVBX,0321HPUSHAXPUSHBXPOPAXPOPBX问AX=

,BX=

。例假设(DS)=1000H,(SS)=4000H,(SP)=100H,(BX)=2100H,(12100)=00A8H,指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的情况。

PUSH

DS

PUSH

BX

PUSH

[BX]

POP

DI

POP

WORDPTR[DI+2]

POP

DSXCHG使用举例1例:MOVAX,5678H;(AX)=5678HMOVBX,0FFFFH;(BX)=0FFFFHXCHGAX,BX;执行后(AX)=0FFFFH,(BX)=5678HXCHG的使用举例2例已知(AX)=6634H,(BX)=0F24H,(SI)=0012H,(DS)=1200H,(12F36H)=2500H,写出下列指令执行的结果。

XCHG

AX,[BX+SI];执行前:(AX)=6634H,(12F36H)=2500H

;执行后:(AX)=2500H,(12F36H)=6634HH2.累加器专用传送指令

IN:输入(I/O

CPU)OUT:输出(CPU

I/O)以后介绍IN与OUT的用法XLAT:换码XLAT:换码格式为:XLATOPR或XLAT功能:查表,将(BX)为首址/表首,以(AL)为表内偏移值(自变量),对应的存储单元中的数据送AL寄存器,即([BX+AL])→AL。执行的操作:16位:(AL)←((BX)+(AL))32位:

(AL)←((EBX)+(AL))操作针对字节表格,首地址放入BX或EBX不影响标志位

XLAT换码举例例(BX)=0040H,(AL)=0FH,(DS)=F000H

执行XLATF0000+0040+0F=0F004FH的内容2CH送AL问题在数据区的变量array开始的若干个字节中存放字节数据,后面接着一个字节变量sum。现要求将array中的数据相加,和存放在sum中。Datasegment Arraydb100,3,5,8,12h,9,125,0a9h,56h,200 Sumdb?Dataends如换为字数据,又该如何?3.地址传送指令

LEA:有效地址送寄存器LDS:指针送寄存器和DSLES:指针送寄存器和ESLFS:指针送寄存器和FSLGS:指针送寄存器和GSLSS:指针送寄存器和SSLEAREG,SRCLDSREG,SRCLESREG,SRCLFSREG,SRCLGSREG,SRCLSSREG,SRCLEA有效地址送寄存器

功能:地址传送主存按源地址SRC的寻址方式计算出偏移地址,再送入指定寄存器执行的操作:(REG)←SRC的地址举例例:设(BX)=0400H,(SI)=003CH,ARR=234H,指令

LEABX,[BX+SI+0F62H]

执行后(BX)=?例:指令LEAAX,ARR,执行后(AX)=?第一条(BX)=0400+003C+0F62=139EH;第二条(AX)=234H注意是地址而不是内容练习主存偏移地址的获取:

MOVBX,0100H;(BX)=0100HMOVSI,0210H;(SI)=0210HLEABX,1234[BX+SI];问(BX)=?答(BX)=1544H注意BX、AX寄存器得到的是偏移地址而不是该存储单元的内容下列两指令功能相同LEAAX,ARRMOVAX,OFFSETARR注:OFFSETARR求出ARR的偏移地址区别:OFFSET仅适用单个符号地址MOVAX,OFFSETARR[SI]错误LDS指针送寄存器和DS指令

格式为LDSREG,SRC执行的操作:(REG)←(SRC)16位

(DS)←(SRC+2)32位

(DS)←(SRC+4)例:LDSDI,[MEM]操作示意图:123456789ABCDE16位32位DSREGMEMREGDS功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器例例1:LDSSI,[10H],如指令执行前(DS)=0C000H,(C0010H)=0180H,(C0012H)=20E8H,(C0014H)=0B35CH,(C0016H)=500AH,则指令执行后

(SI)=?,(DS)=?答案:(SI)=0180H,(DS)=20E8H例2:LDSESI,[10H],条件如上,则指令执行后(ESI)=?,(DS)=?答案:(ESI)=20E80180H,(DS)=0B35CH其它指针送寄存器和段寄存器指令

LES、LFS、LGS、LSS

格式为与

LDS相同,但指定的段寄存器不同执行的操作:(REG)←(SRC)16位(SREG)←(SRC+2)32位(SREG)←(SRC+4)注意:LESAX,BX和LEADS,[BX]及LDSAX,98H

均错,原因?小结注意:LEAREG,SRCLDSREG,SRCLESREG,SRC不影响标志REG不能是段寄存器SRC必须为存储器寻址方式4.标志寄存器传送指令

LAHF:标志送AHSAHF:AH送标志寄存器PUSHF/PUSHFD:标志进栈POPF/POPFD:标志出栈注:隐含操作数;影响标志位LAHF与SAHFLAHF:标志送AH指令格式为:

LAHF执行的操作:(AH)←(FLAGS的低字节)

目的:取出低字节标志位SAHFAH送标志寄存器指令格式为:SAHF执行的操作:(FLAGS的低字节)←(AH)

目的:修改低字节标志位例:设(FLAGS)=0485H,(AX)=1234H,执行指令:LAHF,问AX=?PUSHF/PUSHFD标志进栈格式为:PUSHF执行的操作:(SP)←(SP)-2((SP)+1,(SP))←(FLAGS)设(FLAGS)=9A78H123456789ABCDE操作前SP16位

SP操作后

123456D334BCDEPUSHFD格式为:PUSHFD

执行的操作:(ESP)←(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))←(FLAGSand0FCFFFFH)清除VM、RF位123456789ABCDE操作前ESP32位

操作后

1258A3D334BCDEESPPOPF标志出栈指令

格式为:POPF执行的操作:(FLAGS)←((SP)+1,(SP))(SP)←(SP)+2格式为:POPFD执行的操作:(FLAGS)←((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(ESP)←(ESP)+4类型转换指令CBW字节转换为字指令CWD/CWDE字转换为双字指令CDQ双字转换为4字指令BSWAP字节交换指令CBW字节转换为字指令符号扩展方法:仿照MOVSXDST,SRC中(SRC)的符号扩展方法仅对AL扩展到AX即如(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFHCWDE字转换为双字指令扩展方法类似于CBW仅对AX扩展到EAXCWD字转换为双字指令格式:CWD仅对AX符号扩展到(DX,AX)执行的操作:AX的内容符号扩展到DX。即如(AX)的最高有效位为0,则(DX)=0000;如(AX)的最高有效位为1,则(DX)=0FFFFH。CDQ双字转换为4字指令扩展方法类似于CWD仅对EAX符号扩展到(EDX,EAX)BSWAP字节交换指令格式:BSWAPr32仅对486及后继机型,r32为32位寄存器例:设(EDX)=12345678H,则执行BSWAPEDX后,(EDX)=78563412H3.3.2算术指令算术运算指令:包括二进制运算及十进制运算指令十进制运算指令:压缩BCD码十进制调整指令非压缩BCD码十进制调整指令求数据区中两个1位十进制数的和DatareasegmentAdb3Bdb5sumdb?datareaendscodesegment;定义代码段

assumeCS:code,DS:datareastart:MOVAX,datarea;数据段

MOVDS,AX;地址装入DSMOVDL,AADDDL,BMOVAH,2ADDDL,30HINT21HMOVsum,DLMOVAH,4CHINT21HCodeENDSENDSTART问:程序中屏幕显示正确吗?和的正确显示方法:判别DL中的数是否大于9如不大于9,则直接显示,否则分离数据 MOVBL,DL CMPDL,9 JLEnext MOVCL,4 SHRDL,CL ADDDL,30H MOVAH,2 INT21HNext:MOVDL,BLADDDL,30HMOVAH,2INT21H用到的几个指令CMP比较指令JLE跳转指令,小于则跳转SHR右移指令1.加法指令

ADD:加法,ADDDST,SRC执行的操作:(DST)←(SRC)+(DST)

ADC:带进位加法,ADCDST,SRC执行的操作:(DST)←(SRC)+(DST)+CF

INC:加1,INCOPR执行的操作:(OPR)←(OPR)+1

XADD:交换并相加,ADDDST,SRCDST放SRC,和放DST条件标志位最主要:CF、ZF、SF、OF四位CF位:有进位,CF=l;无进位时CF=0OF位:若两个操作数的符号相同,而结果的符号与之相反时OF=1;否则OF=0CF位可表示无符号数的溢出

OF位表示带符号数的溢出8位二进制数:无符号数为0~255,带符号数为-128~+12716位二进制数:无符号数为0~65535,带符号数为-32768~+327678位数运算的溢出情况(1)二进制加法看作无符号数看作带符号数000001004+4+00001011+11+(+11)

0000111115+15CF=0OF=0000001117+7+11111011+251+(-5)

00000010258+21CF=1OF=0

现为2,结果错8位数运算的溢出情况(2)二进制加法看作无符号数看作带符号数

000010019+9+01111100+124+(+124)

10000101133+133CF=0OF=1

现为-123,结果错

10000111135(-121)

+11110101+245+(-11)

01111100380-132CF=lOF=1

现为124,结果错现为124,结果错例3.45ADDDX,0F0F0H如指令执行前(DX)=4652H,则

46520100011001010010+F0F0+111100001111000000110111010000101指令执行后(DX)=3742H,ZF=0,SF=0,CF=1,OF=0;结果正确求数据区中若干个十进制数的和Datareasegment

Arrdb12,34,56,0a9H,45Hsumdb?datareaendscodesegment;定义代码段

assumeCS:code,DS:datareastart:MOVAX,datareaMOVDS,AXMOVBL,0MOVSi,0

MOVCL,sum-arrAgain:ADDBL,arr[SI] INCSI DECCL JNZagain MOVsum,BL MOVDL,BL MOVCL,4 SHRDL,CL ADDDL,30H续 CMPDL,39H JLEnext ADDDL,7H Next: MOVAH,2INT21H MOVDL,BL ANDDL,0FH ADDDL,30H CMPDL,39H JLEnext1

ADDDL,7NEXT1:MOVAH,2 INT21H MOVDL,‘H’ INT21H MOVAH,4CH INT21HCodeENDSENDSTART;结果54H二次显示统一处理 DatareasegmentArrdb12,34,56,0a9H,45Hsumdb?datarea

endscodesegment;定义代码段

assumeCS:code,DS:datareastart: MOVAX,datarea MOVDS,AX MOVBL,0 MOVSi,0 MOVCL,sum-arrAgain:ADDBL,arr[SI] INCSI DECCL JNZagain MOVsum,BL MOVCH,2show: MOVCL,4 RORBL,CL MOVDL,BL ANDDL,0FH ADDDL,30H CMPDL,39H JLEnext续 ADDDL,7H Next: MOVAH,2

INT21H

DECCH

JNEshow MOVDL,'H' INT21H MOVAH,4CH INT21HCodeENDSENDSTART双精度数的加法(例)设目的操作数存放在DX和AX寄存器中,其中DX存放高位字。源操作数存放在BX、CX中,其中BX存放高位字。如指令执行前,(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H指令序列为:

ADDAX,CX;SF=?,ZF=?,CF=?,OF=?

ADCDX,BX;SF=?,ZF=?,CF=?,OF=?XADD可作字节、字、双字运算例:设(AX)=6A56H,(DX)=30B7HXADDAH,DL;(AH)=?,(DL)=?答案:(AH)=21H,(DL)=6AHXADDDX,AX;(AX)=?,(DX)=?答案:(AX)=30B7H,(DX)=9B0DH2.减法指令

SUB:减法,(DST)←(DST)-(SRC)SBB:带借位减法,(DST)←(DST)-(SRC)-CFDEC:DECOPR减1NEG:NEGOPR求补,(OPR)←0FFFFH-(OPR)+l

CMP:CMPOPR1,OPR2比较

CMPXCHG:比较并交换CMPXCHG8B:比较并交换8字节CMPXCHG:比较并交换格式:CMPXCHGDST,SRC

适用486-SRC只能为寄存器,DST不能为立即数寻址AC与DST比较,确定ZF、DST、ACAC=DST==>ZF=1,DST

SRCAC

DST==>ZF=0,AC

DST例设(AX)=1234H,(DX)=1234H,(CX)=3456H,CMPXCHGDL,CH==>ZF=?,(DL)=?CMPXCHGDH,CH==>ZF=?,(AL)=?CMPXCHGDX,CX==>ZF=?,(DX)=?CMPXCHGCX,DX==>ZF=?,(AX)=?CMPXCHG8BCMPXCHG8B:比较并交换8字节格式:CMPXCHG8BDST源SRC:为64位数据(EDX,EAX)DST:存储器寻址,4字64位目的:(EDX,EAX)与DST比较比较方法与结果跟CMPXCHG类似相同时,DST取(EDX,EAX)值;不相同时,

(EDX,EAX)取DST值;注意

前六种指令均可作字或字节运算,且除DEC不影响CF标志外,它们都影响条件标。减法运算的条件码情况与加法类似减法的OF位的设置方法为:若两个数的符号相反,而结果的符号与减数相同,则OF=1,否则OF=0NEGoper:如(oper)=0,则CF=0,否则CF=1;如(oper)=80H,作字节运算;或(oper)=8000,作字运算,则OF=1,否则OF=0MOVal,123NEGal

CF=1OV=0MOVal,0NEGal

CF=0OV=0MOVal,80HNEGal

CF=1OV=1例3.48SUB[SI+14H],0136H指令执行前(DS)=3000H,(SI)=0040H,(30054H)=4336H则指令执行后

43360100001100110110-0136=>-0000000100110110↓0100001100110110+111111101100101001000010000000

温馨提示

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

评论

0/150

提交评论