![的寻址方式和指令系统_第1页](http://file4.renrendoc.com/view/9b4995d10a19095a371eb7dc08c782ac/9b4995d10a19095a371eb7dc08c782ac1.gif)
![的寻址方式和指令系统_第2页](http://file4.renrendoc.com/view/9b4995d10a19095a371eb7dc08c782ac/9b4995d10a19095a371eb7dc08c782ac2.gif)
![的寻址方式和指令系统_第3页](http://file4.renrendoc.com/view/9b4995d10a19095a371eb7dc08c782ac/9b4995d10a19095a371eb7dc08c782ac3.gif)
![的寻址方式和指令系统_第4页](http://file4.renrendoc.com/view/9b4995d10a19095a371eb7dc08c782ac/9b4995d10a19095a371eb7dc08c782ac4.gif)
![的寻址方式和指令系统_第5页](http://file4.renrendoc.com/view/9b4995d10a19095a371eb7dc08c782ac/9b4995d10a19095a371eb7dc08c782ac5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
会计学1的寻址方式和指令系统23-18086的寻址方式指令由操作码和操作数两部分组成
操作码:指出所要执行的操作(操作的性质)
操作数:指出所需的操作数据(操作的对象)根据操作数的个数,指令可分为:
①双操作数指令:前者为目的操作数,后者为源操作数
②单操作数指令:只有一个操作数:如NOT,INC等有两个操作数,隐含其中一个:
如PUSH,POP等③无操作数指令:没有操作数:NOP
隐含一个操作数:CLI,CLD等第1页/共118页3根据操作数的来源,可分为:
①立即数:数据直接放在指令代码中
②寄存器操作数:存放在CPU内部的寄存器中
③存储器操作数:存放在内部存储器中(绝大部分情况)
④I/O端口操作数:存放在接口电路的寄存器中(适用于IN/OUT指令)指令中的操作数部分可以是操作数本身,也可以是操作数地址或地址的一部分,还可以是指向操作数地址的指针或其他有关操作数的信息。第2页/共118页4寻址方式:指令中说明操作数所在地址的方法。寻址方式的多少反映了寻找操作数的灵活程度,寻址方式越多,则计算机的功能越强,灵活性也越大,能更有效地处理各种数据。执行速度最快的两种寻址为寄存器寻址和立即数寻址。8086中主要的七种寻址方式如下:(与数据有关的寻址方式)第3页/共118页51、立即寻址方式(ImmediateAddressing)
操作数就在指令中,常用来给寄存器赋初值。如:MOVAX,2000HMOVBL,12H
第4页/共118页6注:a、立即数只能作源,不能作目的
MOV2000H,AX非法。b、若16进制立即数以A~F打头,为区别其他符号名,应在前面加数字0,因符号名的命名规则为第一个字符不能为数字。如:MOVAX,0F123Hc、若用等值伪指令EQU定义的为符号常量名,如:COUNTEQU100MOVAX,COUNT
此处COUNT即为立即寻址。第5页/共118页72、寄存器寻址方式(RegisterAddressing)
操作数在指定的寄存器中因寄存器位于CPU内部,其执行速度最高。如:MOVAX,BXMOVAL,BL注:源和目的的长度应一致。第6页/共118页8下面五种(3~7)属于存储器寻址,由于操作数来自内存中,要耗用总线周期才能访问到,故执行速度较前两种寻址方式要慢。要寻找到存储器操作数,必须提供完整的逻辑地址(段基址:偏移地址),而指令中一般只提供偏移地址(又称为有效地址EA),段基址的来源只需参考段寄存器与偏移地址寄存器的基本约定,或用段超越前缀提供。两者叠加算出物理地址PA(PhysicalAddress)。根据有效地址EA(EffectiveAddress)的构成方式,存储器寻址分为以下五种:第7页/共118页9段寄存器使用的基本约定
第8页/共118页103、直接寻址方式(DirectAddressing)EA就在指令中,默认段寄存器为DS如:MOVAX,[2000H]设DS=3000H则EA=2000H,PA=DS×16+EA=32000H,操作数来自32000H(或3000H:2000H处),结果AX=3514H第9页/共118页11注:a、可使用段超越前缀指定其它段寄存器如:MOVAX,ES:[2000H]b、在汇编语言中,可以用符号地址代替数值地址,实际上是给存储单元起一个名字。如:COUNTDW1234HMOVAX,COUNT→直接寻址或MOVAX,[COUNT]其中DW为定义字变量(DefineWord)伪指令,说明符号地址COUNT处存放着一个字,字内容为1234H,结果AX=1234HDW与EQU定义符号的不同点:
①寻址方式不同;
②用DW定义,COUNT单元中的内容可修改,用EQU定义,COUNT为常数。第10页/共118页124、寄存器间接寻址方式(RegisterIndirectAddressing)EA在指定的寄存器中,只能是基址BX、BP,变址SI、DI四者之一。MOVAX,[DX](非法)默认关系:SS:BP,DS:BX、SI、DI
可进行段超越,如MOVAX,DS:[BP]
第11页/共118页13例:MOVAX,[BX]已知BX=5000H,DS=3000H,则EA=(BX)=5000H,PA=DS×16+EA=35000H该指令执行完,AX=32A0H第12页/共118页145、寄存器相对寻址方式(RegisterRelativeAddressing)EA=(BX、BP、SI、DI之一)+(8位或16位位移量)默认关系及段超越同寄存器间接寻址第13页/共118页15例:MOVAX,COUNT[DI]或MOVAX,[COUNT+DI]已知:DI=1000H,DS=3000H,位移量COUNT=0510H则EA=(DI)+COUNT=1510H,PA=DS×16+EA=31510H,该指令执行完,AX=5698H第14页/共118页166、基址变址寻址方式(BasedIndexedAddressing)EA=基址(BX、BP之一)+变址(SI、DI之一)默认关系取决于使用的基址寄存器,只要出现BP即默认SS,也可进行段超越。只有四种组合:BX+SI,BX+DI均与DS结合
BP+SI,BP+DI均与SS结合注意:MOVAX,[BX+BP]及MOVAX,[SI+DI]非法。第15页/共118页17如:MOVAX,[BX+SI]或MOVAX,[BX][SI]设BX=2000H,DS=5000H,SI=0006H,则EA=(BX)+(SI)=2006H,PA=(DS)×16+EA=52006H则该指令执行后,AX=AB78H。MOVAX,[BX+SI]第16页/共118页187、相对基址变址寻址方式(RelativeBasedIndexedAddressing)
EA=(BX、BP之一)+(SI、DI之一)+偏移量(8、16位)
默认关系与段超越同基址变址寻址。
例如:MOVAX,COUNT[BX][SI]MOVAX,COUNT[BX+SI]MOVAX,[BX+SI+COUNT]以上三者等价第17页/共118页19如MOV
AX,MASK[BX][SI]设DS=4100H,位移量MASK=0134H,BX=2500H,SI=1200H
则EA=(BX)+(SI)+MASK=3834H,PA=(DS)×16+EA=44834H,该指令执行完后,AX=5698H
第18页/共118页20其它寻址方式1、隐含寻址:DAA隐含对AL中数据进行十进制调整。2、I/O端口寻址:
直接端口:前256个端口,端口号范围(OOH~FFH),可直接出现在指令中,如INAL,23H;OUT56H,AL
间接端口:端口号范围0000~FFFFH,共64K个端口,由DX间接提供,如:MOVDX,1000H
INAL,DX3、一条指令中含几种寻址方式如:MOV[BX],AL完整描述:源操作数采用寄存器寻址,目的操作数采用寄存器间接寻址。4、转移类指令寻址(与转移地址有关的寻址方式)段内直接、段内间接、段间直接、段间间接共四种(将在控制转移指令中介绍)第19页/共118页213-2指令的机器码表示方法一、基本概念
汇编语言源程序:用汇编语言编写的程序。
汇编程序:将汇编语言源程序翻译成二进制代码的目标程序(机器语言指令)的工具。
汇编:将汇编语言源程序翻译成机器语言的过程。汇编汇编语言源程序------------→目标程序(汇编程序)二、机器语言指令的编码特点8086指令系统采用变长指令,长度由1~6字节组成。第20页/共118页22
1、最短为单字节指令:只包含8位操作码,没有操作数,如CLC等。
2、最长为6字节指令:如MOV[BX+2100H],1234H操作码1字节,寻址方式1字节,16位位移量2字节,16位立即数2字节三、机器语言指令代码的编制介绍手工汇编的规律(略)但目前已有宏汇编程序(MASM等),可实现机器汇编(自动汇编)。第21页/共118页233-38086的指令系统通常一条指令对应着一种基本操作。计算机所能执行的全部指令,构成了计算机的指令系统。计算机的主要功能由指令系统来体现。一般来说,若某台计算机的指令越丰富,寻址方式越多,且每条指令的执行速度都较快,则它的总体功能越强。每种计算机都有自己固有的指令系统。8086的指令按功能可分为六大类:数据传送指令、算术运算指令、逻辑运算和移位指令、字符串处理指令、控制转移指令、处理器控制指令。第22页/共118页24一、数据传送指令:负责数据在寄存器、存储器、I/O端口之间的传递,特点是不影响标志位。1.通用数据传送指令(1)MOV
传送指令(Move)格式:MOV目的,源;(源)→(目的)第23页/共118页25MOV指令使用规则:①立即数不能直接传入段寄存器
MOVDS,2000H(非法)②立即数不能作为目的操作数
MOV2000H,AX(非法)③两个段寄存器之间不能直接传送
MOVDS,ES(非法)④源、目的操作数不能同时为存储器操作数(两内存单元之间不能直接用MOV传送)MOV[BX],[2000H](非法)⑤段寄存器CS不能作为目的操作数,但可作为源操作数MOVCS,AX(非法)第24页/共118页26⑥源和目的操作数字长应一致(8位立即数→16位寄存器例外)MOVAX,BL非法;⑦指令中至少要有一项明确说明传送的是字节还是字,故8位立即数送内存操作时,要用类型说明符BYTEPTR或WORDPTR指明内存类型MOV[2000H],12H非法可改为:MOVBYTEPTR[2000H],12H;字节操作
MOVWORD
PTR[2000H],12H;字操作⑧IP和PSW不能出现在MOV指令中第25页/共118页27(2)堆栈操作指令
PUSH
源;进栈指令①SP-2→SP②源→栈顶
POP
目的;出栈指令
①栈顶→目的②SP+2→SP注意:①只能对字操作,不能对字节操作;
PUSHAL(非法)②立即数不能入栈;
PUSH2000H(非法)③CS可入栈,但不能弹出内容到CSPUSHCS(合法)POPCS(非法)第26页/共118页28堆栈主要用于保护和恢复数据,也可进行数据交换。规定由SS指示堆栈段的段基址,SP始终指向堆栈的顶部,SP的初值规定了所用堆栈段的大小。堆栈的最高地址叫栈底。SPSS堆栈段进栈方向退栈方向栈底栈顶第27页/共118页29(3)XCHG
交换指令(Exchange)格式:XCHGOPR1,OPR2
;寄存器之间,寄存器与存储器之间执行操作:(OPR1)(OPR2)注意:①立即数不能出现在交换指令中;②段寄存器不能出现在交换指令中;③存储单元之间不能直接交换;
XCHG[1000H],[2000H](非法)
第28页/共118页30(4)XLAT
表转换指令(换码、查表)(Translation)格式:XLAT
或XLAT转换表名
功能:完成一个字节的查表转换。
((DS)×16+(BX)+(AL))
→AL
步骤:①首先在内存中建表;(TABLEDB…)②使BX指向表的首地址;
(MOVBX,OFFSETTABLE)
③查表中某项时,将该项相对于表首地址的偏移量→AL;(MOVAL,5)
④执行XLAT,转换后的结果→AL。
(AL=12H,即5的七段显示码)第29页/共118页312.输入输出指令:累加器(AX或AL)←→I/O端口(1)INAX(或AL),端口地址;输入(Input)指令(2)OUT
端口地址,AX(或AL);输出(Output)指令①直接I/O指令:端口号直接出现在指令中,寻址范围为0~255,最大端口号为FFH(255)如:INAL,12HOUT34H,AL②间接I/O指令:端口号由DX间接指定,可寻址范围为整个64K个端口(0000H~FFFFH)注:I/O指令中的其中一个操作数必为累加器(AL或AX),如为AX,则为16位端口的字操作,16位端口由两个地址连续的8位端口组成。如:MOVDX,300HOUTDX,AXAL
→
300H端口AH
→
301H端口第30页/共118页323.地址目标传送指令:将地址(段地址和偏移地址)送入指定的寄存器。(1)LEA取有效地址指令
(LoadEffectiveAddress)格式:LEA目的,源;源的EA→目的寄存器功能:常用于使某个寄存器作为地址指针。注意:a、源只能是存储器操作数,不能为立即数或寄存器操作数;b、目的只能为16位寄存器,不能为8位寄存器及段寄存器。第31页/共118页33注意:LEASP,[BX]及MOVSP,[BX]的区别例:设BX=1234H,DS=2000H,(21234H)=78H,(21235H)=56H则LEA执行完后,SP=1234H
MOV执行完后,SP=5678H总结:设置地址指针有2种方法。
①LEABX,TABLE
②MOVBX,OFFSETTABLE
上面两条指令等价。第32页/共118页34(2)LDS
双字指针送DS和寄存器指令
(LoadPointerusingDS)格式为:LDS目的,源;目的和源的规定同LEA功能:将源指向的前2个字节内容(EA)→目的(常用SI)将源指向的后2个字节内容(段基址)→DS(3)LES
双字指针送ES和寄存器指令
(LoadPointerusingES)注意:双字指针包含完整的段基址和偏移地址。
双字指针在内存中存放占用连续的4个字节地址,规律为:偏移地址(或EA)→低地址字单元
段基址→高地址字单元第33页/共118页354.标志传送指令:读出或改写PSW(1)LAHF
;PSW的低位字节→AH(LoadAHfromFlags)
(2)SAHF
;PSW的低位字节←AH(StoreAHintoFlags)(3)PUSHF;PSW内容入栈(PushFlagsontoStack)(4)POPF
;栈顶内容弹出到PSW
(PopFlagsoffStack)注意:前两条为兼容8位CPU的指令,不常用;后两条(PUSHF和POPF)一般成对出现于子程序和中断服务程序的开头和结尾处,用于保护和恢复现场。第34页/共118页36总结:数据传送指令中除SAHF及POPF外,均不影响PSW中的各标志位。第35页/共118页37二、算术运算指令:加、减、乘、除特点:均影响PSW中的状态标志位。计算机中的数分为:(1)二进制
无符号:所有位均为数值位。
带符号:最高位表示符号位,0正1负,用补码表示。(2)十进制
压缩:每4位表示一个十进制数位,1个字节可表示2位十进制数
非压缩:1个字节表示1位十进制数(只用低4位表示十进制数位,高4位为0或无意义)如:19D=压缩:0001,1001BCD(即19H)=非压缩:0000,0001,0000,1001BCD(即0109H)第36页/共118页38双操作数指令:其中至少有一个为寄存器操作数,但不能为段寄存器(立即数与存储器运算结果→存储器除外)单操作数指令:不能为立即数及段寄存器结论:(1)加减运算:无符号数与带符号数可采用同一套指令。(2)乘除运算:无符号数与带符号数有各自的一套指令。注意:在二进制加减运算中,
CF:衡量无符号数运算的结果是否有进位
OF:衡量带符号数运算的结果是否有溢出第37页/共118页391.加法指令(1)ADD
加法指令(Addition)格式:ADD目的,源;源+目的→目的
a.影响所有状态标志
b.段寄存器不能出现
c.两个操作数不能同为存储器操作数
d.类型一致(B/W)(2)ADC
带进位加法指令(AdditionwithCarry)功能:除两操作数相加外,还应加上CF(源+目的+CF→目的)用于多字(多字节)加法运算中的高字(高字节)加法中如双精度数运算(指双字数据,即32位长度)第38页/共118页40(3)INC
增量指令(加1指令)(Increment)
格式:INC
目的;目的+1→目的单操作数指令,影响除CF之外的其余5个状态标志。功能:a.修改地址指针(增量修改)
b.修改循环计数器(正计数法)如为存储器操作数,则应加上类型说明符PTR进行说明。
如:INC[BX](非法)
可改为:INCBYTEPTR[BX];字节操作INCWORDPTR[BX];字操作第39页/共118页41(4)DAA
压缩BCD码加法调整指令
(DecimalAdjustforAddition)调整原理:
化16进1(每4个二进制位为一体)为逢10进1例:08H+07H应得15H对0FH+6调整(因F非BCD码)09H+09H应得18H对12H+6调整(因AF=1)结论:如AF=1或低4位二进制数码对应的BCD码大于9时,则加6进行调整;往上则考查CF是否为1。DAA隐含对AL中的数据调整成压缩BCD码形式,应紧跟ADD或ADC指令之后。典型应用:ADD(或ADC)AL,源;二进制加法
DAA
;调整为十进制结果第40页/共118页42具体调整方法:a.如AF=1或AL中低4位为A~F,则AL+06H→AL且使AF=1;b.如CF=1或AL中高4位为A~F,则AL+60H→AL且使CF=1;对AL中二进制加法结果用DAA调整后,AL可能:
①不变(高、低4位均未调整,AF=CF=0)
②+06H(只调整了低4位,AF=1,CF=0)③+60H(只调整了高4位,CF=1,AF=0)
④+66H(高、低4位均调整,AF=CF=1)【例如】ADDAL,BL
DAA若执行前:AL=28H,BL=68H,则执行ADD后:AL=90H,CF=0,AF=1;执行DAA指令后:AL=96H,CF=0,AF=1。第41页/共118页43(5)AAA
非压缩BCD码加法调整
(ASCIIAdjustforAddition)隐含对AL进行调整,但调整后影响AH。应用情况同DAA,紧跟ADD或ADC指令之后。调整方法:a、AL低4位如为A~F或AF=1
则AL+6→AL,AH+1→AH,使AF=1b、清AL高4位
c、AF值送CF特点:执行后AF和CF只能为相同值。第42页/共118页442.减法指令(1)SUB减法指令(Subtraction)格式SUB目的,源;目的-源→目的
(2)SBB
带借位的减法指令(SubtractwithBorrow)格式:SBB目的,源;目的-源-CF→目的
↓进/借位标志用于多字节(多字)减法运算中。(3)DEC
减量指令(减1指令)(Decrement)格式:DEC目的;目的-1→目的影响除CF之外的其余5个状态标志功能:①修改地址指针(减量修改)
②修改循环计数器(减计数法)注意:由于是单操作数指令,如为存储器操作数,应加类型说明符PTR进行说明。第43页/共118页45(4)NEG
求补(取负)指令(Negate)格式:NEG目的;0-目的→目的功能:正数变负数,负数变正数。
NEG例如:11111111(-1的补码)←→00000001(+1的补码)可用于求负数的绝对值单操作数指令,规定同INC、DEC指令。(5)CMP
比较指令(Compare)格式:CMP目的,源;目的-源(但不保存结果)实质上是相减操作,但不保存相减的结果,只是减法运算影响各标志位。希望比较两个数的大小,而又不破坏两个操作数的场合。其后一般紧跟条件转移指令。第44页/共118页46CMP指令主要用来比较两数大小、相等关系。①比较两个数是否相等,看ZF标志位,ZF=1则相等②比较两数大小时a.无符号数:看CF标志位(是否够减)CF=0,无借位,被减数大,减数小CF=1,有借位,被减数小,减数大b.带符号数:看SF和OF标志位
SF⊕OF=0
SF=0,0F=0被减数大,
SF=1,0F=1减数小SF⊕0F=1
SF=1,0F=0被减数小,SF=0,0F=1减数大第45页/共118页47(6)DAS
压缩BCD码减法调整指令
(DecimalAdjustforSubtraction)应紧跟在SUB或SBB之后,隐含对AL中数据的调整。格式:SUB(或SBB)AL,源
DAS具体调整:相应位减06H(置AF位)及减60H(置CF位)经DAS后,AL有可能不变、-06H、-60H、-66H。(7)AAS
非压缩BCD码减法调整指令
(ASCIIAdjustforSubtraction)隐含对AL进行调整,但调整后影响AH。AF和CF只能为相同值。总结:BCD码的加法调整和减法调整指令都隐含操作数在AL中,即对AL中结果进行调整。因此对BCD数据的加减运算只能以字节为单位,如果以字为单位进行加减,则低字节向高字节的进位及高字节中的低半字节向高半字节的进位均无法判断,失去了调整的依据。第46页/共118页483.乘法指令(1)MUL
无符号数乘法指令(Multiply)格式:MUL源(2)IMUL带符号数乘法指令(IntegerMultiply)格式:IMUL源隐含被乘数来源于与源操作数长度相等的累加器中(AX或AL)
字节乘法:字节(AL)*字节(源)→字(AX)
字乘法:字(AX)*字(源)→双字(DX,AX)若指令中为存储器操作数,也需应用PTR指明其类型。第47页/共118页49乘法指令只影响0F和CF位(且同时影响),其余无定义(状态不定)(1)对于MUL,字节乘法后AH=0或字乘法后DX=0,则0F=CF=0,否则均为1(2)对于IMUL,如果乘积的高一半是低一半的符号扩展,则CF=0F=0,否则均为1(即看结果的高一半是否包含有效数字位)利用OF和CF状态可决定是否需要保存积的高位字节或高位字。注:带符号数的乘法是先化为正数×正数的形式,如结果应为负,再对结果取补码即可。第48页/共118页50(3)AAM
非压缩BCD码乘法调整指令
(ASCIIAdjustforMultiply)对存于AL中的两个非压缩十进制数相乘的乘积进行调整,结果存于AX中。具体调整过程:
AL÷10→AH(商)
AL(余数)注:BCD码的乘法要求两个乘数均为非压缩BCD码,且为字节数据,这样8位*8位=16位(结果高8位必为00H,因最大乘法9*9=81,只需AL就可放下),因此只需对AL中结果进行调整。第49页/共118页51【例】MULBL
AAM若执行前:AL=06H,BL=09H,则执行MULBL
后,AX=0036H,再执行AAM指令后,正确的结果为:AH=05H,AL=04H。第50页/共118页524.除法指令(1)DIV
无符号数除法指令(Divide)格式:DIV源(2)IDIV
带符号数除法指令(IntegerDivide)格式:IDIV源隐含被除数
字节除法:字(AX)÷字节(源)→AL(商),AH(余数)
字除法:双字(DX,AX)÷字(源)→AX(商),DX(余数)注意:①除法操作后,若结果超出商的表示范围(AL或AX放不下),则看作除法为0的情况,产生0号中断;②IDIV指令执行后,余数的符号一定要和被除数相同;③在作除法前,保证被除数一定为除数的两倍长度,否则要进行扩展;第51页/共118页53无符号数:清除AH(字节除法)或DX(字除法)带符号数:要进行符号扩展:两条符号扩展指令如下:(3)CBW
字节转换为字指令(ConvertBytetoWord)功能:AL中的字节→AX中的字(字节除法)若AL最高有效位D7=0,则AH=0;若AL最高有效位D7=1,则AH=FFH。(4)CWD
字转换为双字指令(ConvertWordtoDoubleWord)功能:AX中的字→DX,AX中的双字(字除法)若AX最高有效位D15=0,则DX=0;若AX最高有效位D15=1,则DX=FFFFH。第52页/共118页54【例】5678H÷1234HMOVAX,5678H;被除数MOVBX,1234H;除数MOVDX,0或
CWD;被除数扩展DIVBX或IDIVBX;执行除法第53页/共118页55(5)AAD
非压缩BCD除法调整指令(ASCIIAdjustforDivide)BCD码的除法要求两操作数均为非压缩BCD码,且只能进行字节除法,即16÷8=8余8,其中被除法来自AX中。调整方法是在作除法之前对被除数进行调整:
AH*10+AL→AL
0→AH第54页/共118页56【例】将十进制数45除以7,商和余数分别存于数据段1000H和1001H单元。
MOVAX,0405H;非压缩BCD码形式
MOVBL,07H;除数
AAD
;AL=2DH=45D,AH=0DIVBLMOV[1000H],AL;存商,AL=6MOV[1001H],AH;存余数,AH=3注:如不用AAD调整,则0405H=4*256+5=1029,除以7之后结果为147余0。第55页/共118页57总结:BCD码运用指令中,对加、减、乘,先是利用普通二进制运算指令算出二进制结果,然后用专门调整指令对结果进行调整,对于除法,则是先对被除数进行调整,再用普通除法指令进行运算。第56页/共118页58三、逻辑运算和移位指令(位处理指令)特点:按位操作,必须化为二进制1.逻辑运算指令操作数规定同算术运算指令双操作数指令:使CF=0F=0,AF无定义,影响SF、ZF、PF单操作数指令(NOT):不影响标志位
(1)AND
逻辑与指令(LogicalAnd)
运算规则:全1出1,有0出0某些位保持不变(与“1”),另外一些位屏蔽掉(与“0”)例:ANDAL,OFH;屏蔽AL高4位,低4位保持不变第57页/共118页59(2)OR
逻辑或指令(LogicalOr)
运算规则:有1出1,全0出0某些位保持不变(或“0”),另外一些位置1(或“1”)例:ORAL,0FH;使AL低4位置1,高4位保持不变(3)XOR
异或指令(ExclusiveOr)
运算规则:相同为0,相异为1某些位保持不变(异或“0”),另外一些位取反(异或“1”)例:XORAL,OFH;使AL低4位取反,高4位保持不变用于判断两个数是否相等:XORAX,BX实现某个操作数清零:XORAX,AX使操作数各位取反:XORAX,0FFFFH第58页/共118页60(4)NOT
取反指令(LogicalNot)
运算规则:按位取反如操作数为存储器操作数,应用PTR指明其类型。
NOTALINCAL等价于NEGAL(5)TEST
测试指令(Test)功能:进行“与”运算,但不保存结果,影响标志位。用于在不想改变两数的情况下,检测某位或某几位是否满足条件,后面紧跟条件转移指令,从而引出分支。一般情况下,TEST指令的源操作数设置为一个立即数,其中需要测试的位为1,其它位为0。测试正负数:TESTAL,80H或TESTAX,8000H之后判断ZF=1,正数;ZF=0,负数测试奇偶数:TESTAL,01H或TESTAX,0001H之后判断ZF=1,偶数;ZF=0,奇数第59页/共118页612.算术逻辑移位指令(非循环移位)特点:移位后操作数逐渐丢失格式:操作码目的,移位次数注意:a.移位次数为1,可直接出现在指令中,移位次数如大于1,则应将其放入CL中,由CL间接指定;b.影响CF、OF、PF、SF、ZF,但AF位无定义c.移位前后如符号位发生变化,则OF置1,(移位次数>1,则OF不确定),而CF为最后移出的一位。第60页/共118页62(1)SHL
逻辑左移指令(ShiftLogicalLeft)(2)SAL
算术左移指令(ShiftArithmeticLeft)
两者功能相同,左移1位相当于乘2运算(3)SHR逻辑右移指令(ShiftLogicalRight)右移1位相当于无符号数除2运算(4)SAR算术右移指令(ShiftArithmeticRight)
将操作数看成带符号数,移位过程中符号位保持不变。右移1位相当于带符号数除2运算注:因移位指令执行速度快,而乘除法执行速度慢,故常用来编制乘除法程序。第61页/共118页63【例】AL*5→AL(不计溢出)MOVBL,AL;暂存原始值
MOVCL,2;移位次数SHL(或SAL)AL,CLADDAL,BL第62页/共118页643.循环移位指令特点:移位后不丢失有效位格式及操作数规定同算术逻辑移位指令。(1)ROL
循环左移指令(RotateLeft)(2)ROR
循环右移指令(RotateRight)(3)RCL
带进位循环左移指令(RotatethroughCarryLeft)(4)RCR
带进位循环右移指令(RotatethroughCarryRight)其中RCL和RCR将CF也包含在循环圈中。第63页/共118页65四、字符串处理指令功能:用一条指令实现对一串字符或数据的操作(字节串/字串)串处理的隐含约定:(1)源串由DS:SI指向(可进行段超越)(2)目的串由ES:DI指向(固定组合)(3)SI、DI自动修改(±1字节串,±2字串)(4)DF控制串处理的方向
DF=0,增量修改SI、DI(+1或+2),CLD指令
DF=1,减量修改SI、DI(-1或-2),STD指令(5)串长度(字节数或字数)由CX指定第64页/共118页66为加快执行速度,可在基本指令前加三种重复前缀。(1)REP
无条件重复(重复条件:CX≠0)用于MOVS和STOS前面(2)REPE/REPZ
相等/结果为0则重复(重复条件:CX≠0且ZF=1)用于CMPS和SCAS前面(3)REPNE/REPNZ
不相等/结果非0则重复(重复条件:CX≠0且ZF=0)用于CMPS和SCAS前面第65页/共118页671.MOVS
字符串传送指令(MoveString)格式:a.MOVS目的串,源串b.MOVSB/MOVSW
;字节串或字串传送执行的操作:(1)(DS:SI)→(ES:DI)(2)SI±1→SI,DI±1→DI
或SI±2→SI,DI±2→DI注:DF=0,用“+”;当DF=1时,用“-”
字节串±
1,字串±
2第66页/共118页68与REP前缀联用:REPMOVSB/MOVSW操作:(1)若CX=0,则退出串处理(2)CX-1→CX
(3)执行一次MOVSB/MOVSW,跳回(1)所以,应用之前需完成4件事:①DS:SI指向源串②ES:DI指向目的串③数据串的长度→CX④CLD或STD决定串处理方向【例】将数据段中以SRC_MESS为偏移地址的一串字符“HELLO!”,传送到附加段中以NEW_LOC开始的单元中。第67页/共118页69DATASEGMENT;数据段SRC_MESSDB‘HELLO!’;源串DATAENDSEXTRASEGMENT;附加段NEW_LOCDB6DUP(?)
;目的串EXTRAENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,ES:EXTRA;段分配START:MOVAX,DATAMOVDS,AX;初始化DSMOVAX,EXTRAMOVES,AX;初始化ES第68页/共118页70
LEASI,SRC_MESS;SI指向源串LEADI,NEW_LOC;DI指向目的串MOVCX,6;CX存放串长度CLD;增量修改地址指针REPMOVSB;重复串传送CODEENDSENDSTART
;源程序结束执行完后,SI=SRC_MESS+6,DI=NEW_LOC+6,CX=0第69页/共118页71【例】将数据段中偏移地址为1000H开始的一串字符“HELLO!”传送到附加段中偏移地址为2000H开始的单元中。MOVSI,1000HMOVDI,2000HMOVCX,6CLDREPMOVSB执行完后,SI=1006H,DI=2006H,CX=0第70页/共118页722.CMPS
字符串比较指令(CompareString)格式:a.CMPS目的串,源串
b.CMPSB/CMPSW执行的操作:(1)(DS:SI)-(ES:DI)
不保存结果,只影响标志位(主要看ZF)(2)SI±1→SI,DI±1→DI
或SI±2→SI,DI±2→DI第71页/共118页73常用来比较两个数据区是否全部相等,此时与REPZ(REPE)联用。格式:REPZ(REPE)CMPSB/CMPSW重复条件:CX≠0且ZF=1,即上次比较相等且串未比较完操作:①CX=0或ZF=0,则退出串处理②CX-1→CX③执行CMPSB/CMPSW一次,跳回①第72页/共118页74主要用来实现在两个数据区中寻找第一个不相等的元素(与REPZ/REPE联用)或第一个相等的元素(与REPNZ/REPNE联用)。【例】比较两个字符串,一个是设定的口令串PASSWORD,另一个是从键盘输入的字符串IN_WORD,若两者相同,程序正常执行,否则发出警告声音。DATASEGMENT;数据段PASSWORDDB‘8086CPU’;口令串IN_WORDDB‘8088CPU’;输入串COUNTEQU8;串长度DATAENDS第73页/共118页75CODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,ES:DATA
;段分配START:……;初始化段寄存器LEASI,PASSWORD;SI指向源串LEADI,IN_WORD;DI指向目的串MOVCX,COUNT;CX存放串长度CLD;增量修改地址指针REPZCMPSB;重复串比较JNESOUND;ZF=0(不等),转SOUND处OK:……;ZF=1,口令通过SOUND:……;口令未通过,发声警告CODEENDSENDSTART第74页/共118页76【例】将存在0700H~070FH单元中的非压缩BCD数与存在0800H~080FH单元中的非压缩BCD数进行比较,已知有一对数相等,找出该数,并存入AL中,将该数在源串中所处存储单元的偏移地址存入DX中。MOVSI,0700HMOVDI,0800HMOVCX,10HCLDREPNECMPSB;CX≠0且ZF=0(两数不等)时,重复。DECSI;找到后,指针减1MOVDX,SIMOVAL,[SI]第75页/共118页773.SCAS字符串扫描指令(串搜索)(ScanString)格式:a.SCAS目的串
b.SCASB/SCASW执行的操作:(1)AL(或AX)-(ES:DI)
不保存结果,只影响标志位(主要看ZF)(2)DI±1→DI或DI±2→DI第76页/共118页78常用来搜索某数据区中是否含有关键字(关键字送入AL或AX中),此时与前缀REPNZ/REPNE联用格式:REPNZ(REPNE)SCASB/SCASW重复条件:CX≠0且ZF=0(上次比较不等且串未比较完)操作:①CX=0或ZF=1(找到)则退出串处理②CX-1→CX③执行一次SCASB/SCASW,跳回①如与REPZ(REPE)则用来搜索数据区中第一个不等于关键字的单元。第77页/共118页79【例】在某一字符串中搜索是否有字符A,若有,则把搜索次数记下来,送到BX中;若没有,则将BX清0。
MOVDI,OFFSETSTRING;DI指向目的串MOVCX,COUNT;CX存放串长度
MOVAL,‘A’;AL放关键字CLD;增量修改地址指针REPNESCASB;重复串搜索JZFIND;ZF=1(搜到),转FIND处MOVDI,0;ZF=0,未搜到FIND:MOVBX,DI;搜到第78页/共118页80【例】从地址为1000H单元开始,存放长度为256个字节的字符串,找出字符串中第一个‘$’(ASCI码为24H),并将其存放地址偏移量存入DX中。(如串中无‘$’,则存入0作为标记)
MOVDX,0;以0作为标记
MOVDI,1000HMOVAL,24HMOVCX,256CLDPEPNZSCASBJNZEXIT;串中无‘$’,跳EXITDECDJMOVDX,DJEXIT:HLT;停机指令第79页/共118页814.LODS
数据串装入指令(从串取)
(LoadString)格式:a.LODS源串
b.LODSB/LODSW执行的操作:(1)(DS:SI)→AL(或AX)(2)SI±1→SI或SI±2→SI
类似于MOVAX(AL),[SI]区别在于自动修改地址指针SI一般不与REP联用。如与REP联用,AL或AX将不断被刷新,只能保留最后写入的数据。第80页/共118页825.STOS
数据串存储指令(存入串)
(StoreString)格式:a.STOS目的串
b.STOSB/STOSW执行的操作:(1)AL(或AX)→(ES:DI)(2)DI±1→DI或DI±2→DI
常与REP联用,用AL或AX中的常数来初始化一片内存。第81页/共118页83【例】将附加段中偏移地址为0400H开始的256个字节单元清0。
MOVDI,0400H或MOVDI,0400HMOVAL,0MOVAX,0MOVCX,256MOVCX,128CLDCLDREPSTOSBREPSTOSW第82页/共118页84注意:一般在循环程序中,LODS常与STOS联用,先由LODS将数据取入AL(AX)中处理后,再用STOS存入另一数据区中。【例】在存储器数据段中有一数据块,起始地址为BLOCK,数据块中的数为8位带符号数,要求把正、负数分开,分别送至附加段的两个缓冲区,存放正数的起始地址为PLUS_DATA,存放负数的起始地址为MINUS_DATA。第83页/共118页85MOVSI,OFFSETBLOCK;SI指向源串
MOVDI,OFFSETPLUS_DATA;DI指向正数区
MOVBX,OFFSETMINUS_DATA;BX指向负数区
MOVCX,COUNT;CX放循环次数CLD;增量方向GOON:LODSB
;源串的一个字节→AL
TESTAL,80H
;测试符号位(最高位)JNZMINUS;ZF=0,为负数,转MINUS
STOSB
;存正数
JMPAGAIN;转到循环判断MINUS:XCHGBX,DI;交换正负数区的指针
STOSB
;存负数XCHGBX,DI;恢复正负数区的指针AGAIN:DECCX;次数减1JNZGOON;未完,继续处理下一个第84页/共118页86总结:①当用REP前缀时,执行完串处理后,SI和DI均指向数据区末地址的下一个字节(或字)单元,CX则减为0。②当用REPZ和REPNZ前缀时,有两种情况结束串处理:
a.条件一直满足,直到比较完最后一个单元,此时CX=0,SI、DI指向数据区末地址+1或+2处;可用ZF判断最后一次比较是否相等(ZF并不因CX递减为0而置1)。b.条件不满足,此时CX≠0,SI、DI分别指向违反条件的单元地址的下一个单元处。③MOVS、LODS、STOS不影响标志位;CMPS和SCAS影响标志位,主要看对ZF的影响。④若源串和目的串位于同一段中,应把DS和ES初始化为相同数值。a.分配同一段ASSUME…DS:DATA,ES:DATAb.初始化相同值
MOVAX,DATAMOVDS(ES),AX第85页/共118页87五、控制转移指令特点:改变CS和IP,用来控制程序的执行流程。转移方式可分为:
段内转移:只改变IP值,不改变CS值
段间转移:CS和IP都改变
直接转移:转移地址由指令直接提供
间接转移:转移地址由寄存器或内存单元间接提供第86页/共118页88与转移地址有关的寻址方式共有4种:(以JMP指令为例)(1)段内直接寻址格式1:JMPSHORTLP;段内短转移格式2:JMPNEARPTRLP;段内近转移
LP为转移的符号地址(标号)短跳转要求LP所指向指令与JMP下一条指令的距离为-128~+127(偏移量为8位);近跳转要求LP所指向的指令与JMP下一条指令的距离为-32768~+32767。
第87页/共118页89(2)段内间接寻址:转向的IP值由寄存器或存储单元提供。格式1:JMPBX;BX→IP格式2:JMPWORDPTR[BX];内存DS:BX的字内容→IP其中WORDPTR用以区分段间间接方式,可缺省。【例】设BX=2000H,DS=3000H,(32000H)=40H,
(32000H)=50H,则执行JMPBX后,IP=2000H而执行JMP[BX]后,IP=5040H注:新的IP再与CS(不变)结合即可得出转向的物理地址。第88页/共118页90(3)段间直接寻址:指令中直接提供了转向的段基址和偏移地址格式:JMPFARPTRLPLP为标号(转向的符号地址)
注:LP所指向的指令与本JMP指令不在同一段内(4)段间间接寻址:用存储器中连续4个字节单元的内容分别取代IP和CS。具体:前2个字节内容→IP后2个字节内容→CS注:只能用存储器寻址方式提供,且用DWORDPTR(双字)指明。第89页/共118页91【例】JMPDWORDPTR[BX]设DS=2000H,BX=1000H,(21000H)=10H,(21001H)=20H,(21002H)=30H,(21003H)=40H,
则执行后:CS=4030H,IP=2010H
转向地址为4030H:2010H
注:段间方式可转到内存中任意一个地方去。注:无条件转移指令(JMP)及过程调用指令(CALL)可采用上述4种寻址方式;而所有的条件转移指令及循环控制指令只能采用段内直接寻址方式,且只能为段内短转移(转移范围为-128~+127字节之间)。第90页/共118页921.无条件转移和过程调用指令(1)JMP
无条件转移指令(Jump)格式:JMP目的可转向内存中任何地方。(2)CALL
、RET
过程调用和返回指令
(Call、Return)过程又称子程序①CALL过程名分两步执行:a.将返回地址(CALL指令下一条指令的地址)入栈
b.转移到子程序入口地址(由CALL的操作数提供)第91页/共118页931)段内直接调用:格式:CALLNEARPTRPROC1其中NEARPTR可缺省
无段内短调用指令。2)段内间接调用:格式1:CALLSI格式2:CALLWORDPTR[BX];WORDPTR可缺省注:对于段内调用,具体操作如下:a.SP-2→SP,返回地址IP入栈
b.子程序入口地址→IP特点:主、子程序在同一个代码段中,只改变IP,不改变CS第92页/共118页943)段间直接调用:格式:CALLFARPTRPROC24)段间间接调用:格式:CALLDWORDPTR[BP][SI]注:对于段间调用,具体操作如下:a.SP-4→SP,返回地址CS、IP入栈(先CS后IP)
b.子程序入口地址→CS和IP特点:主、子程序不在同一代码段中,CS和IP均要改变。第93页/共118页95②RET:过程返回,放在子程序末尾执行操作:将堆栈中的返回地址弹回如为段内调用的RET,则弹出一个字→IP,SP+2→SP如为段间调用的RET,则弹出两个字→IP和CS,SP+4→SP(先IP后CS)注:CALL指令保护返回地址的入栈顺序与RET指令恢复返回地址的出栈顺序正好相反。第94页/共118页96带参数的返回指令:RETn
;n应为偶数执行步骤:①执行RET指令②SP+n→SP实质:在返回地址出栈后,还可以修改堆栈指针,从而释放一些已使用过数据所占的单元。这些数据一般是主程序在调用子程序之前先把一些参数放入堆栈,在子程序中已经使用了这些参数,故返回主程序后,应该修改SP来释放单元。【例】RET8设执行之前,SP=3000H,则执行后
SP=3000H+2+8=300AH(段内返回)
SP=3000H+4+8=300CH(段间返回)第95页/共118页972.条件转移指令:只支持段内短转移根据上一条指令所设置的标志位来判断测试条件。格式:J***短标号;***表示测试条件①满足条件,则转移到标号处执行②不满足条件,顺序执行下一条指令(不转移)(1)直接标志转移指令测试单个条件标志(除AF外的其它5个状态标志)①JZ(JE)测试条件:ZF=1
相等(为0)则转移②JNZ(JNE)测试条件:ZF=0
不相等(不为0)则转移③、④
JC/JNC
测试条件:CF=1/CF=0
⑤、⑥
JS/JNS
测试条件:SF=1/SF=0⑦、⑧
JO/JNO测试条件:OF=1/OF=0⑨、⑩
JP/JNP测试条件:PF=1/PF=0第96页/共118页98【例3.87】求AL和BL寄存器中的两数之和,若有进位,则AH置1,否则AH清0。(P111)
ADDAL,BL
JC
NEXT;有进位,转NEXTMOVAH,0;无进位JMPEXIT;跳到统一出口NEXT:MOVAH,1;有进位EXIT:;统一出口第97页/共118页99(2)间接标志转移指令比较两个无符号数
E等于(Equal)测试条件:ZF=1
A高于(Above)测试条件:CF=0
B低于(Below)测试条件:CF=1①JA(JNBE)高于;不低于或等于②JB(JNAE)低于;不高于或等于③JAE(JNB)高于或等于;不低于④JBE(JNA)低于或等于;不高于第98页/共118页100b.比较两个带符号数
E等于(Equal)测试条件:ZF=1
G大于(Great)测试条件:SF⊕OF=0
L小于(Less)测试条件:SF⊕OF=1①JG(JNLE)大于(>);不小于或等于②JL(JNGE)小于(<);不大于或
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030全球PCA输液泵行业调研及趋势分析报告
- 2025年全球及中国结构型包装用蜂窝行业头部企业市场占有率及排名调研报告
- 2025-2030全球自主最后一英里送货机器人行业调研及趋势分析报告
- 2025年全球及中国可见光超透镜行业头部企业市场占有率及排名调研报告
- 2025-2030全球钣金冲焊型液力变矩器行业调研及趋势分析报告
- 2025-2030全球教育行业CRM软件行业调研及趋势分析报告
- 2025-2030全球艾氏剂行业调研及趋势分析报告
- 2025-2030全球卡车液力变矩器行业调研及趋势分析报告
- 2025年全球及中国钴铁合金软磁材料行业头部企业市场占有率及排名调研报告
- 2025-2030全球高速RDF制粒机行业调研及趋势分析报告
- 小学六年级数学上册《简便计算》练习题(310题-附答案)
- 地理标志培训课件
- 2023行政主管年终工作报告五篇
- 2024年中国养老产业商学研究报告-银发经济专题
- 培训如何上好一堂课
- 高教版2023年中职教科书《语文》(基础模块)下册教案全册
- 2024医疗销售年度计划
- 税务局个人所得税综合所得汇算清缴
- 人教版语文1-6年级古诗词
- 上学期高二期末语文试卷(含答案)
- 人教版英语七年级上册阅读理解专项训练16篇(含答案)
评论
0/150
提交评论