第2次课 80x86的指令系统和寻址方式I_第1页
第2次课 80x86的指令系统和寻址方式I_第2页
第2次课 80x86的指令系统和寻址方式I_第3页
第2次课 80x86的指令系统和寻址方式I_第4页
第2次课 80x86的指令系统和寻址方式I_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

第2次

指令系统和寻址方式I2013年4月2日第3章重点(1)

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

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

(隐含操作数)如字节转换为字CBW示例1:指令、程序初步从键盘输入一个字符,然后从屏幕输出CODESEGMENTASSUMECS:CODESTART:

MOVAH,1;键盘输入

INT21H;放入ALMOVDL,AL;显示内容

MOVAH,2;设功能

INT21H;显示

MOVAH,4CHINT21HCODEENDSENDSTART;返回;DOS汇编程序书写注意事项字母大小写不区分分号“;”所在行后面是注释符号:用字符A~Z,a~z,数字0~9专用字符?,点.,@,下划线_,$标识符用上述符号构成,第一个不能为数字,有效长31保留字不要用于变量或标号变量或标号的定义只许出现1次程序中涉及的操作数与寻址段地址:datarea

段寄存器:DS寄存器:AX、BX、CX、AH、DL 混合形式:str[BX]符号地址:Again、STR 数字:8、2、4CHDS与AX:传入数据作用:CX与8:传入数据8 BX与0:传入数据0AH与2::传入数据2,设置功能DL与str[BX]:传入数据BX:自增 CX:自减Again:标号地址 AH与4CH:传入数据4CH3.1.1与数据有关的寻址方式8086/80286系列立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址80386及后继机型比例变址寻址基址比例变址寻址相对基址比例变址寻址

3.180x86的寻址方式

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

即(CX)=(CH,CL)=(30H,64H)MOVEAX,12345678H==>(EAX)=12345678H…6430…MOVCX,8被编译成二进制代码B90800MOVAH,2被编译成二进制代码B402MOVAH,4CH被编译成二进制代码B44C…B90008…MOVCX,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错所需的操作数在存储器中。操作数所在单元的有效地址存放在寄存器中,指令中给出寄存器的名称仅限于BX、BP、SI、DI-基址/变址寄存器中4.寄存器间接寻址EA操作数段基地址+存储器寄存器MOVAX,[BX]例:如果(DS)=2000H,(BX)=1000H,执行MOVAX,[BX]则因物理地址=20000+1000=21000H,结果为:(AX)=50A0H…A050…000010002000H:寄存器间接寻址(续)对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,物理地址=16d

(SS)十(BP)练习如果(DS)=4000H,(SS)=3000H,(BP)=2000H(BX)=3000H,(32000H)=1234H,(42000H)=5678H,(53000H)=9876H,(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位位移量6.基址变址寻址所需的操作数在存储器中。操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和两个寄存器均由段与寄存器间的默认关系确定例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]设(DS)=4000H,(SS)=3000H,(ES)=5000H,(SI)=2000H,(BX)=3000H,(32000H)=1234H,(42000H)=5678H,(53000H)=9876H,(55000H)=56A0H求(AX)=?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]编程举例从键盘输入2个一位数,求他们的和,并存放在变量sum中。DatareasegmentsumDB?datareaendscodesegment;定义代码段

assumeCS:code,DS:datareastart:

MOVAX,datareaMOVDS,AXMOVAH,1INT21HSUBAL,30H

MOVBL,ALMOVAH,1INT21HSUBAL,30HADDAL,BLMOVSUM,AL

MOVAH,4CHINT21HCodeENDSENDstart;键盘输入键盘输入;转换;另存;转换;相加;保存寻址方式总结16/32位寻址方式有效地址组成:位移量、基址寄存器、变址寄存器、比例因子有效地址:

EA=基址值+(变址值*比例因子)+位移量物理地址求法:(段基地址)*16d+EA注意寄存器的对应使用数据定义及存储器分配3.1.2与转移地址有关的寻址方式:延后一周控制转移指令初步循环程序的结构形式条件转移指令JZOPR(或JEOPR)结果为零(或相等),ZF=1,则跳转。JNZOPR(或JNEOPR)结果不为零(或不相等),ZF=0,则转移。JSOPR结果为负,SF=l,则转移JNSOPR结果为正,SF=0,则转移JOOPR

溢出,OF=1,则转移JNOOPR不溢出,OF=0,则转移JP(或JPE)OPRJP(或JPE)奇偶位为1,PF=l,则转移。JNP(或JPO)奇偶位为0,PF=0,则转移。JB(或JNAE,JC)低于;或者不高于或等于;或进位为1,CF=1,则转移。JNB(或JAE,JNC)不低于,或者高于或等于,或进位为零,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.绝对跳转JMP简介跳转方式与范围:段内、跨段1.段内直接寻址2.段内间接寻址3.段间直接寻址4.段间间接寻址格式:JMP地址地址的书写有多种如JMPnext;next为一个标号JMParray[BX];array为数组变量名跳转的几个例子JMPSHORTADDR1JMPNEARPTRADDR2JMPTABLE[BX]JMPFARPTRADDR3JMPDWORDPTR[AGAIN+BX]JMPBXJMP[BX+DI]3.2指令的执行时间-自学

一条指令的执行时间是取指令、取操作数、执行指令及传送结果各个阶段所需时间的总和指令的基本执行时间因指令的不同而异当需要访问存储器取得操作数时还需要考虑计算有效地址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],0FA50HPTR是类型属性操作符Wordptr指向字数据,Byteptr指向字节数据有强制类型转换成分3.3指令系统指令系统可分为6组:数据传送指令算术指令逻辑指令控制转移指令串处理指令处理机控制指令3.3.1数据传送指令通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送指令类型转换指令数据传送指令数据传送的类型:字/字节类型传送寄存器←→寄存器寄存器←→存储器累加器←→I/O端口1.通用数据传送指令传送:MOV ;一般传送MOVSX、MOVZX ;特殊进栈:PUSH ;一般进栈PUSHA、PUSHAD ;所有Reg按序进栈出栈:POP ;一般出栈POPA、POPAD ;所有Reg按序出栈XCHG交换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举例

例:DATA1、data为字数据变量名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字操作,针对栈操作,先进后出(FILO)16位操作数(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变化序:AXCXDXBXSPBPSIDI出栈次序相反XCHG交换指令格式为

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,SRC4.标志寄存器传送指令LAHF:标志送AHSAHF:AH送标志寄存器PUSHF/PUSHFD:标志进栈POPF/POPFD:标志出栈注:隐含操作数;影响标志位除了SAHF/POPF外,均不影响FLAGSLAHF与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.加法指令

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,BLMOVAH,4CHINT21HCodeENDSENDSTART双精度数的加法(例)设目的操作数存放在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字节注意

前六种指令均可作字或字节运算,且除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+111111101100101001000010000000001↙有进位时CF=0

所以,(30054H)=4200H,SF=0,ZF=0,CF=0,OF=0例3.49SUBDH,[BP+4]如指令执行前(DH)=41H,(SS)=0000H,(BP)=00E4H,(000E8)=5AH则指令执行后

410100000101000001-5A=>-01011010=>+1010011011100111所以,(DH)=0E7H,SF=1,ZF=0,CF=1,OF=0例3.50设X,Y,Z均为双精度数,分别放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中。下列指令实现:W←X+Y+24-Z,用W、W+2单元放运算结果。M0VAX,MOVDX,X+2ADD

温馨提示

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

评论

0/150

提交评论