第3章80X86的指令系统和寻址方式_第1页
第3章80X86的指令系统和寻址方式_第2页
第3章80X86的指令系统和寻址方式_第3页
第3章80X86的指令系统和寻址方式_第4页
第3章80X86的指令系统和寻址方式_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

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

文档简介

本章主要内容:数据类型80X86的寻址方式80X86的指令系统本章重点:80X86寻址方式、指令系统第3章80x86的指令系统和寻址方式指令系统一组指令的集合

操作码操作数...操作数指令寻址方式与数据有关的寻址方式与转移地址有关的寻址方式第3章80x86的指令系统和寻址方式物理地址的形成80X86微机在其内部定点处理单元微处理器和浮点单元FPU的支持下,可处理7种类型数据:无符号二进制数带符号二进制数浮点数BCD码串数据ASCII码数据指针类数据3.1数据类型80X86微机中,存储器既存放数据也存放程序即指令80X86的寻址方式包括程序寻址方式和数据寻址方式3.280X86的寻址方式80X86指令中所需的操作数来自以下三个方面

1.操作数包含在指令中MOVAX,3069H2.操作数包含在微处理器的某个内部寄存器中MOVAL,BH3.操作数包含在存储器中MOVAX,[2000H]3.2.180X86的寻址方式80X86微机系统中,任何内存单元的地址由段基址和偏移地址(又称偏移量)组成,段基址由段寄存器提供,偏移量由以下四个基本部分组成

1.基址寄存器

2.变址(间址)寄存器

3.比例因子

4.位移量有效地址EA=基址+变址*比例因子+位移量当采用16位寻址方式时,80X86使用8位或16位的位移量,用BX或BP作基址寄存器,SI和DI变址寄存器,比例因子为1;3.2.180X86的寻址方式当采用32位寻址方式时,使用8位或16位的位移量,所有32位通用寄存器都可作为基址寄存器,除ESP外的所有通用寄存器都可作变址寄存器,并采用2、4、8几种不同的比例因子。▲16位和32位寻址的差异地址成分16位寻址32位寻址基址寄存器BX、BP任何32位通用寄存器变址寄存器SI、DI除ESP外的任何32位通用寄存器比例因子11、2、4、8

立即寻址

MOVAX,3069H寄存器寻址

MOVAL,BH直接寻址

MOVAX,[2000H]寄存器间接寻址

MOVAX,[BX]

基址寻址MOVAX,[AX+24]变址寻址ADDAX,TABLE[SI]带比例因子的变址寻址

MOVAX,TABLE[SI*4],7

基址变址寻址

MOVAX,[BP][DI]基址带比例因子的变址寻址

MOVAX,[EI*4][EA]相对基址变址寻址

ADDAX,[SI][BP+00FFH]相对、比例因子变址基址寻址

MOVAX,[DI*4][BP+80H]3.2.1数据寻址方式指令格式:MOVAL,5MOVAX,3064HMOVAL,‘A’*

只能用于SRC字段MOV40H,AL

*SRC和DST的字长一致

MOVAH,3064H

(1)立即寻址方式*——操作数在指令中给出(2)寄存器寻址方式*—操作数在指定的寄存器中

MOVAX,BXMOVAL,BHMOVAX,3064H*

字节寄存器只有AHALBHBLCHCLDHDL*SRC和DST的字长一致MOVAH,BX*

CS不能用MOV指令改变

MOVCS,AX

例:MOVAX,[2000H]

EA=2000H,假设(DS)=3000H,那么PA=32000H*

隐含的段为数据段DS*

可使用段跨越前缀

MOVAX,ES:[2000H]*操作数地址可由变量(符号地址)表示,但要注意VALUEDB10变量的属性MOVAH,VALUE

MOVAX,VALUEMOVAX,WORDPTRVALUE5030

32000AHAL3050(AX)=3050H直接寻址方式*(直接--可以理解为在编译阶段已经确定的地址)—EA在基址寄存器(BX/BP)或变址寄存器(SI/DI)中

MOVAX,[BX]PA=16d(DS)+(BX)MOVAX,ES:[BX]PA=16d(ES)+(BX)MOVAX,[BP]PA=16d(SS)+(BP)*不允许使用AX、CX、DX存放EAMOVAX,[CX]*

SRC和DST的字长一致

MOVDL,[BX];[BX]指示一个字节单元MOVDX,[BX];[BX]指示一个字单元*

适于数组、字符串、表格的处理(4)寄存器间接寻址*

有效地址=(BX)(BP)8位(SI)16位(DI)+位移量指令格式:MOVAX,COUNT[SI]或MOVAX,[COUNT+SI]

假设(DS)=3000H,(SI)=2000H,COUNT=3000H,则:PA=35000H

假设(35000H)=1234H,那么(AX)=1234H*适于数组、字符串、表格的处理寄存器相对寻址方式*

(变址寻址)指令格式:

MOVAX,[BX][DI]MOVAX,[BX+DI]MOVAX,ES:[BX][SI]*适于数组、字符串、表格的处理*必须是一个基址寄存器和一个变址寄存器的组合

MOVAX,[BX][BP]MOVAX,[SI][DI]有效地址=(BX)(SI)(BP)(DI)+(6)基址变址寻址方式*

基址变址寻址

MOVAX,MASK[BX][SI]

或MOVAX,MASK[BX+SI]或MOVAX,[MASK+BX+SI]

有效地址=(BX)(SI)8位(BP)(DI)16位++位移量(7)相对基址变址寻址方式相对基址变址寻址EA=(基址寄存器)+(变址寄存器)比例因子+位移量(1)比例变址寻址方式

例:MOVEAX,COUNT[ESI4]80386新增的寻址方式(2)基址比例变址寻址方式

例:MOVECX,[EAX][EDI4]

(3)相对基址比例变址寻址方式

例:MOVEAX,TABLE[EBP][EDI4](4)带位移量的基址变址寻址

例:addedx,[esi][ebp+00fffff0h](5)带位移量、带比例因子变址基址寻址

例:moveax,[edi*4][ebp+80]

段内寻址段内直接寻址JMP1000H

段内间接寻址JMPBX

段间寻址

段间直接寻址JMP2500H:3600H

段间间接寻址JMPDWORDPTR[DI]3.2.2程序寻址方式无条件转移指令为例只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令操作数label是要转移到的目标地址(目的地址、转移地址)JMP指令分成4种类型:⑴段内转移、直接寻址⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址JMPlabel ;程序转向label标号指定的地址目标地址的寻址方式直接寻址方式转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式间接寻址方式转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式目标地址的范围:段内段内转移——近转移(near)在当前代码段64KB范围内转移(±32KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移——短转移(short)转移范围可以用一个字节表达,在段内-128~+127范围的转移代码段代码段JMP目标地址的范围:段间段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段

实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr

或farptr

强制段间转移、直接寻址JMPfarptrlabel ;IP←label的偏移地址 ;CS←label的段地址将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmpfarptrotherseg;远转移到代码段2的otherseg段间转移、间接寻址JMPfarptrmem ;IP←[mem],CS←[mem+2]用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx];转移到1500h:0JMP段内转移、直接寻址JMPlabel ;IP←IP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负

jmp

again

;转移到again处继续执行

……again:

deccx

;标号again的指令

……

jmp

output

;转向output

……output:

movresult,al

;标号output的指令段内转移、间接寻址JMPr16/m16

;IP←r16/m16将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容jmpax ;IP←AXjmpwordptr[2000h] ;IP←[2000h]

8086和80286的操作数宽度和寻址宽度都是16位的

32位处理器的操作数宽度和寻址宽度可以是16位的,也可以是32位的。

1.W域与操作数宽度

2.默认的操作数宽度和寻址宽度

3.指令的操作数宽度和寻址宽度前缀3.2.3操作数宽度和寻址宽度的确定

16位端口对齐于偶数地址

32位端口对齐于能被4整除的地址

I/O地址空间的寻址方式很简单,仅有两种

1.直接寻址例:inal,32h

2.DX间接寻址例:inax,dx3.2.4I/O地址空间访问存储器的方式默认的段寄存器可跨越的段寄存器偏移地址取指令CS无IP堆栈操作SS无SP一般数据访问DSCSESSS有效地址EABP作为基址的寻址SSCSDSESBP串操作的源操作数DSCSESSSSI串操作的目的操作数ES无DI注:段寄存器的使用规定3.2.5段寄存器的确定数据传送指令算术指令

逻辑指令移位与循环移位指令位操作指令位串操作指令串操作指令与重复前缀转移指令调用与返回指令3.380X86的指令系统指令的汇编格式指令的基本功能指令支持的寻址方式指令的执行对标志位的影响指令的特殊要求操作的上下文环境对于每一条指令重点关注:

通用数据传送指令

MOV、PUSH、POP、XCHG

累加器专用传送指令IN、OUT、XLAT地址传送指令LEA、LDS、LES标志寄存器传送指令LAHF、SAHF、PUSHF、POPF类型转换指令CBW、CWD3.3.1数据传送指令:重点掌握

数据传送是计算机中最基本、最重要的一种操作传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位重点掌握MOVXCHGXLATPUSHPOPLEA传送指令:MOVDST,SRC执行操作:(DST)(SRC)注意:*DST、SRC不能同时为段寄存器MOVDS,ES*立即数不能直接送段寄存器

MOVDS,2000H*DST不能是立即数和CS*DST、SRC不能同时为存储器寻址*不影响标志位MOVAX,DSEGMOVDS,AX1、通用数据传送指令1)传送指令MOV(move)把一个字节或字的操作数从源地址传送至目的地址MOVreg/mem,imm;立即数送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存MOVreg/seg,mem;主存送(段)寄存器MOVreg/mem,seg;段寄存器送寄存器或主存例3.1:立即数传送moval,4 ;al←4,字节传送movcx,0ffh ;cx←00ffh,字传送movsi,200h ;si←0200h,字传送movbyteptr[si],0ah;byteptr说明是字节操作movwordptr[si+2],0bh;wordptr说明是字操作注意立即数是字节量还是字量明确指令是字节操作还是字操作MOV例3.2:寄存器传送movax,bx ;ax←bx,字传送movah,al ;ah←al,字节传送movds,ax ;ds←ax,字传送mov[bx],al ;[bx]←al,字节传送例3.3:存储器传送moval,[bx]movdx,[bp] ;dx←ss:[bp]moves,[si] ;es←ds:[si]不存在存储器向存储器的传送指令例3.4:段寄存器传送mov[si],dsmovax,es ;ax←esmovds,ax ;ds←ax←es对段寄存器的操作有一些限制MOV指令传送功能MOV并非任意传送立即数段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存储器非法传送种种两个操作数的类型不一致例如源操作数是字节,而目的操作数是字;或相反两个操作数不能都是存储器传送指令很灵活,但主存之间的直接传送却不允许段寄存器的操作有一些限制段寄存器属专用寄存器,对他们的操作能力有限两个操作数的类型要一致绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令MOVAL,050AH;非法指令:050Ah为字,而AL为字节寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byteptr指示字节类型,wordptr指示字类型两个操作数不能都是存储器8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现movax,buffer1;ax←buffer1(将buffer1内容送ax)movbuffer2,ax;buffer2←ax;这里buffer1和buffer2是两个字变量;实际表示直接寻址方式要小心段寄存器的操作不允许立即数传送给段寄存器MOVDS,100H;非法指令:立即数不能传送段寄存器不允许直接改变CS值MOVCS,[SI] ;不允许使用的指令不允许段寄存器之间的直接数据传送MOVDS,ES;非法指令:不允许段寄存器间传送

进栈指令:PUSHSRC执行操作:(SP)(SP)–2((SP)+1,(SP))(SRC)

出栈指令:POPDST执行操作:(DST)((SP)+1,(SP)) (SP)(SP)+2堆栈:‘先进后出’的存储区,段地址存放在SS中,

SP在任何时候都指向栈顶,进出栈后自动修改SP。

注意:

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

*不影响标志位

*不能用立即寻址方式PUSH1234H

*DST不能是CSPOPCS2)进、出栈指令进栈指令PUSHpushaxpush[2000h]PUSHr16/m16/seg;SP←SP-2;SS:[SP]←r16/m16/seg出栈指令POPpopaxpop[2000h]POPr16/m16/seg;r16/m16/seg←SS:[SP];SP←SP+2堆栈的特点堆栈操作的单位是字,进栈和出栈只对字量字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据堆栈常用来临时存放数据传递参数保存和恢复寄存器例:假设(AX)=2107H,执行PUSHAX********(SP)PUSHAX执行前(SP)********07H21H低地址

高地址PUSHAX执行后进栈方向(SP)********07H21HPOPBX执行前(SP)********07H21H低地址

高地址POPBX执行后(BX)=2107H例:POPBX出栈方向例3.5:现场保护恢复pushax ;进入子程序后pushbxpushds...popds ;返回主程序前popbxpopax

交换指令:XCHGOPR1,OPR2执行操作:(OPR1)(OPR2)注意:

*不影响标志位*不允许使用段寄存器例:XCHGBX,[BP+SI]XCHGAL,BH3)交换指令XCHG把两个地方的数据进行互换寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据XCHGreg,reg/mem;regreg/mem3)交换指令XCHG例3.6:寄存器间交换movax,1234h ;ax=1234hmovbx,5678h ;bx=5678hxchgax,bx;ax=5678h,bx=1234hxchgah,al ;ax=7856h例3.7:寄存器与存储器交换xchgax,[2000h] ;字交换;等同于xchg[2000h],axxchgal,[2000h] ;字节交换;等同于xchg[2000h],al

输入指令IN(I/OCPU)

长格式:INAL,PORT(字节)INAX,PORT(字)执行操作:(AL)(PORT)(字节)(AX)(PORT+1,PORT)(字)短格式:INAL,DX(字节)INAX,DX(字)执行操作:(AL)((DX))(字节)(AX)((DX)+1,(DX))(字)

2、累加器专用传送指令(只限使用AX或AL)输出指令OUT(CPUI/O)长格式:OUTPORT,AL(字节)OUTPORT,AX(字)执行操作:(PORT)(AL)(字节)(PORT+1,PORT)(AX)(字)短格式:OUTDX,AL(字节)OUTDX,AX(字)执行操作:((DX))(AL)(字节)((DX)+1,(DX))(AX)(字)注意:*不影响标志位*

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

DX(短格式)例:INAX,28H MOVDATA_WORD,AX例:MOVDX,3FCHINAX,DX例:OUT5,AL例:测试某状态寄存器(端口号27H)的第2位是否为1INAL,27HTESTAL,00000100BJNZERROR;若第2位为1,转ERROR处理例:Sound程序

movdx,100inal,61handal,11111100bsound:xoral,2;101out61h,al;ONOFFONmovcx,140h;脉宽(发声时间间隔)Wait1:loopwait1decdxjnesound设备控制寄存器端口61H1/00控制其它外部设备与门放大器2号定时器门控10换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码表格首地址存放于BX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码3.换码指令XLAT(translate)将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给ALXLAT ;al←ds:[bx+al](BX)30HF004031HF0041(AL)=332HF004233HF0043TABLE(DS)=F000H换码指令:XLAT或XLATOPR执行操作:(AL)((BX)+(AL))例:MOVBX,OFFSETTABLE;(BX)=0040HMOVAL,3XLATTABLE指令执行后(AL)=33H注意:

*不影响标志位*字节表格(长度不超过256)

首地址(BX)*需转换的代码位移量(AL)

4、地址传送指令地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令LEA指针传送指令LDS和LES注意不是获取存储器单元的内容

有效地址送寄存器指令:LEAREG,SRC执行操作:(REG)SRC

指针送寄存器和DS指令:LDSREG,SRC执行操作:(REG)(SRC)(DS)(SRC+2)

相继二字寄存器、DS

指针送寄存器和ES指令:LESREG,SRC执行操作:(REG)(SRC)(ES)(SRC+2)

相继二字寄存器、ES有效地址传送指令LEA(loadEA)将存储器操作数的有效地址传送至指定的16位寄存器中LEAr16,mem;r16←mem的有效地址EA例3.7:获取有效地址movbx,0400hmovsi,3chleabx,[bx+si+0f62h];BX=0400h+003ch+0f62h=139EH获得主存单元的有效地址;不是物理地址,也不是该单元的内容可以实现计算功能指针传送指令LDSr16,mem;r16←mem,;DS←mem+2LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器LESr16,mem;r16←mem,;ES←mem+2LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器例3.8:地址指针传送movwordptr[3060h],0100hmovwordptr[3062h],1450hlesdi,[3060h] ;es=1450h,di=0100hldssi,[3060h] ;ds=1450h,si=0100h

mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:r16或ES:r16例:LEABX,[BX+SI+0F62H]

LDSSI,[10H]

LESDI,[BX]40H00H00H30HTABLE(DS):1000HMOVBX,TABLE;(BX)=0040HMOVBX,OFFSETTABLE;(BX)=1000HLEABX,TABLE;(BX)=1000HLDSBX,TABLE;(BX)=0040H

;(DS)=3000HLESBX,TABLE;(BX)=0040H

;(ES)=3000H注意:

*不影响标志位*REG不能是段寄存器*SRC必须为存储器寻址方式标志送AH指令:LAHF执行操作:(AH)(FLAGS的低字节)

AH送标志寄存器指令:SAHF执行操作:(FLAGS的低字节)(AH)

标志进栈指令:PUSHF执行操作:(SP)(SP)-2((SP)+1,(SP))(FLAGS)

标志出栈指令:POPF执行操作:(FLAGS)((SP)+1,(SP))(SP)(SP)+2*影响标志位5、标志寄存器传送指令

CBWALAX

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

CWDAX(DX,AX)

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

例:(AX)=0BA45HCBW;(AX)=0045HCWD;(DX)=0FFFFH(AX)=0BA45H注意:*无操作数指令*隐含对AL或AX进行符号扩展*不影响条件标志位6、符号扩展指令

加法指令

ADD、ADC、INC

减法指令

SUB、SBB、DEC、NEG、CMP

乘法指令

MUL、IMUL

除法指令

DIV、IDIV

十进制调整指令

DAA、DAS、AAA、AAS、AAM、AAD3.3.2算术指令:

加法指令:ADDDST,SRC执行操作:(DST)(SRC)+(DST)

带进位加法指令:ADCDST,SRC执行操作:(DST)(SRC)+(DST)+CF

加1指令:INCOPR执行操作:(OPR)(OPR)+1注意:*除INC指令不影响CF标志外,均对条件标志位有影响。1、加法指令例:双精度数的加法

(DX)=0002H(AX)=0F365H(BX)=0005H(CX)=8100H指令序列

ADDAX,CX;(1)ADCDX,BX;(2)

(1)执行后,(AX)=7465H

CF=1OF=1SF=0ZF=0(2)执行后,(DX)=0008HCF=0OF=0SF=0ZF=0减法指令:SUBDST,SRC执行操作:(DST)(DST)-(SRC)带借位减法指令:SBBDST,SRC执行操作:(DST)(DST)-(SRC)-CF减1指令:DECOPR执行操作:(OPR)(OPR)-1求补指令:NEGOPR执行操作:(OPR)-(OPR)比较指令:CMPOPR1,OPR2执行操作:(OPR1)-(OPR2)注意:*除DEC指令不影响CF标志外,均对条件标志位有影响。2、减法指令

例:x、y、z均为双精度数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+24-z,并用W,W+2单元存放wMOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元

无符号数乘法指令:MULSRC带符号数乘法指令:IMULSRC执行操作:字节操作数(AX)(AL)*(SRC)字操作数(DX,AX)(AX)*(SRC)注意:

*AL(AX)为隐含的乘数寄存器。*AX(DX,AX)为隐含的乘积寄存器。*SRC不能为立即数。*除CF和OF外,对条件标志位无定义。3、乘法指令乘法指令对CF/OF的影响:例:(AX)=16A5H,(BX)=0611H

(1)

IMULBL

;(AX)(AL)*(BL)

;A5*115B*11=060BF9F5

;

(AX)=0F9F5H

CF=OF=1(2)

MULBX

;(DX,AX)(AX)*(BX)

;16A5*0611=00895EF5

;

(DX)=0089H(AX)=5EF5H

CF=OF=1-128*-128<32767;-128*127>-327670,0乘积的高一半为零1,1否则MUL指令:CF,OF=0,0乘积的高一半是低一半的符号扩展1,1否则

IMUL指令:CF,OF=1010010101011011

无符号数除法指令:DIVSRC带符号数除法指令:IDIVSRC执行操作:字节操作(AL)(AX)/(SRC)的商(AH)(AX)/(SRC)的余数字操作(AX)(DX,AX)/(SRC)的商(DX)(DX,AX)/(SRC)的余数注意:

*AX(DX,AX)为隐含的被除数寄存器。*AL(AX)为隐含的商寄存器。*AH(DX)为隐含的余数寄存器。*SRC不能为立即数。*对所有条件标志位均无定义。如何判别结果有效?4、除法指令例:x,y,z,v均为16位带符号数,计算(v-(x*y+z–540))/xMOVAX,XIMULY;x*y→(DX,AX)MOVCX,AXMOVBX,DXMOVAX,ZCWD;Z→(DX,AX)ADDCX,AXADCBX,DX;x*y+z→(BX,CX)SUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWD;V→(DX,AX)SUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x→(AX) 余数→(DX)(1)压缩的BCD码调整指令●DAA加法的十进制调整指令●DAS减法的十进制调整指令(2)非压缩的BCD码调整指令●AAA加法的ASCII码调整指令●AAS减法的ASCII码调整指令●AAM乘法的ASCII码调整指令●AAD除法的ASCII码调整指令本部分不做要求压缩BCD运算举例:(1)MOVAL,BCD1

;BCD1=34H

ADDAL,BCD2

;BCD2=59H,(AL)=8DH

DAA;8DH+06H=93H

MOVBCD3,AL;BCD3=93H(2)MOVAL,BCD1;BCD1=34H

SUBAL,BCD2

;BCD2=59H,(AL)=0DBH

DAS;0DBH-60H-06H=75H

MOVBCD3,AL;BCD3=75=-25(10n’补码)非压缩BCD运算举例:(1)MULBL;(AX)=(AL)×(BL)=08×09

AAM;(AL)/0AH=48H/0AH→0702(2)AAD;(AX)→(AH)×0AH+(AL)=48H

DIVBL;(AL)=(AX)/(BL)=48H/4=12HAAM;(AL)/0AH=12H/0AH=0108

逻辑运算指令

AND、OR、NOT、XOR、TEST循环、移位指令

SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR3.3.3逻辑运算指令

3.3.4移位与循环移位指令逻辑非指令: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逻辑运算指令例:屏蔽AL的第0、1两位

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

ORAL,20H

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

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

TESTAL,1JZEVEN

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

******01XOR00000011

******10

********AND11111100******00********AND000000010000000*逻辑左移SHLOPR,CNT逻辑右移SHROPR,CNT算术左移SALOPR,CNT(同逻辑左移)算术右移SAROPR,CNT

CF0

0CFCF2逻辑、算术移位指令循环左移ROLOPR,CNT循环右移ROROPR,CNT带进位循环左移RCLOPR,CNT带进位循环右移RCROPR,CNTCF

CFCFCF3循环移位注意:

*OPR可用除立即数以外的任何寻址方式*CNT=1,SHLOPR,1CNT>1,MOVCL,CNTSHLOPR,CL;以SHL为例*条件标志位:

CF=移入的数值

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

SF、ZF、PF根据移位结果设置,AF无定义循环移位指令:

不影响SF、ZF、PF、AFOF=例:(AX)=0012H,(BX)=0034H,把它们装配成(AX)=1234H例:(BX)=84F0H(1)(BX)为无符号数,求(BX)/2

SHRBX,1

;(BX)=4278H(2)(BX)为带符号数,求(BX)×2

SALBX,1

;(BX)=09E0H,OF=1(3)(BX)为带符号数,求(BX)/4MOVCL,2 SARBX,CL;(BX)=0E13CHMOVCL,8ROLAX,CLADDAX,BXMOVCH,4;循环次数MOVCL,4;移位次数NEXT:ROLBX,CLMOVAX,BXANDAX,0FHPUSHAXDECCHJNZNEXT00080004000F0000(SP)(3)(BX)=84F0H,把

(BX)

中的16位数每4位压入堆栈

设置方向标志指令

CLD、STD

串处理指令

串重复前缀(串传送)MOVSB/MOVSWREP(串存储)STOSB/STOSW(串读取)LODSB/LODSW(串比较)CMPSB/CMPSWREPE/REPZ或REPNE/REPNZ(串扫描)SCASB/SCASW

3.3.7串操作指令与重复前缀

REP执行操作:(1)如(CX)=0则退出REP,否则转(2)(2)(CX)(CX)-1(3)执行MOVS/STOS/LODS(4)重复(1)~(3)与REP配合工作的MOVS?/STOS?/LODS?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:将数据段中的整串数据传送到附加段中。源串(数据段)→目的串(附加段)执行REPMOVS之前,应先做好:(1)源串首地址(末地址)→SI(2)目的串首地址(末地址)→DI(3)串长度→CX(4)建立方向标志(CLD使DF=0,STD使DF=1)(SI)(DI)

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

将‘personal_computer’这一字符串由数据段传到附加段leasi,mess1leadi,mess2

movcx,17cld

repmovsb

leasi,mess1+16leadi,mess2+16movcx,17stdrepmovsbSTOSDSTSTOSB(字节)STOSW(字)执行操作:

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

例:把附加段中的10个字节缓冲区置为20Hleadi,mess2moval,20Hmovcx,10cldrepstosbleadi,mess2movax,2020Hmovcx,5cldrepstoswSTOS存入串指令:LODSSRC

LODSB(字节)LODSW(字)执行操作:字节操作:(AL)←((SI)),(SI)←(SI)±1字操作:(AX)←((SI)),(SI)←(SI)±2注意:*LODS指令一般不与REP联用*源串一般在数据段中(允许使用段跨越前缀来修改),目的串必须在附加段中*不影响条件标志位LODS从串取指令:REPE/REPZREPNE/REPNZ

执行操作:(1)如(CX)≠0且ZF=1(或(CX)≠0且ZF=0

)转(2)否则退出串操作(2)(CX)←(CX)-1(3)执行CMPS/SCAS(4)重复(1)~(3)与REPE/REPZ(REPNE/REPNZ)配合工作的

CMPS和SCAS

CMPSSRC,DSTCMPSB(字节)CMPSW(字)执行操作:两个串进行比较

(1)((SI))-((DI))根据比较结果置条件标志位:相等ZF=1不等ZF=0(2)字节操作:(SI)←(SI)±1,(DI)←(DI)±1字操作:(SI)←(SI)±2,(DI)←(DI)±2

CMPS串比较指令:

SCASDSTSCASB(字节)SCASW(字)执行操作:

字节操作:(AL)-((DI)),(DI)←(DI)±1字操作:(AX)-((DI)),(DI)←(DI)±2SCAS串扫描指令:

例:从一个字符串中查找一个指定的字符messdb‘COMPUTER’

moves,segmess;scans隐含使用扩展段leadi,messmoval,‘T’movcx,8cldrepnescasbCOMPUTER(di)

(di)(CX)=2(di):相匹配字符的下一个地址(cx):剩下还未比较的字符个数例:比较两个字符串,找出它们不相匹配的位置例:反向传送leasi,mess1leadi,mess2movcx,8cldrepecmpsbleasi,mess1+7leadi,mess2+7movcx,8STdrepmovsb

无条件转移指令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、IRET3.3.8控制转移指令

3.3.9调用与返回指令段内直接短转移:JMPSHORTOPR执行操作:(IP)←(IP)+8位位移量

例:jmp20段内直接近转移:JMPNEARPTROPR执行操作:(IP)←(IP)+16位位移量例:jmp100段内间接转移:JMPWORDPTROPR执行操作:(IP)←(EA)

例:jmpax(寄存器间接寻址的转移只可能是段内转移)段间直接远转移:JMPFARPTROPR执行操作:(IP)←OPR的段内偏移地址(CS)←OPR所在段的段地址

例:jmp0ae3:3段间间接转移:JMPDWORDPTROPR执行操作:(IP)←(EA)(CS)←(EA+2)1、无条件转移指令:例:jmpdwordptrbuf[bx]执行前:ds=3000h,bx=0020h,buf=0100h,(30120)=1234h,(30122h)=5678其物理地址=30000h+0020h+0100h=30120执行后:cs=5678,ip=1234例3.59JMPNEARPTRTABLE[BX];为段内转移, IP←[BX+TABLE][BX+TABLE+1]JMPFARPTRTABLE[BX];为段间转移, IP←[BX+TABLE][BX+TABLE+1]; CS←[BX+TABLE+2][BX+TABLE+3]在16位寻址方式下,可以用WORD和DWORD来区分不带标号的转移是段内转移还是段间转移。例3.60JMPWORDPTR[BX];为段内转移,IP←[BX][BX+1]JMPDWORDPTR[BX];为段间转移,IP←[BX][BX+1], CS←[BX+2][BX+3]例3.61DRVTBLLABELWORDDWDRV$INITDWMEDI$CHK ┇DWENTRY ┇ENTRY:┇MOVAX,SEGDRVTBLMOVDS,AXMOVSI,NUMBER;NUMBER为表中ENTRY存储地址相对 ;DRVTBL的偏移量JMPNEARPTRDRVTBL[SI]注意:只能使用段内直接寻址的8位位移量(所有的条件转移指令均为短转移)(1)根据单个条件标志的设置情况转移

格式测试条件JZ(JE)lableZF=1JNZ(JNE)lableZF=0JS lableSF=1JNSlable

温馨提示

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

评论

0/150

提交评论