微机原理总汇编指令集合.docx

上传人:b****6 文档编号:13095494 上传时间:2023-06-11 格式:DOCX 页数:18 大小:68.14KB
下载 相关 举报
微机原理总汇编指令集合.docx_第1页
第1页 / 共18页
微机原理总汇编指令集合.docx_第2页
第2页 / 共18页
微机原理总汇编指令集合.docx_第3页
第3页 / 共18页
微机原理总汇编指令集合.docx_第4页
第4页 / 共18页
微机原理总汇编指令集合.docx_第5页
第5页 / 共18页
微机原理总汇编指令集合.docx_第6页
第6页 / 共18页
微机原理总汇编指令集合.docx_第7页
第7页 / 共18页
微机原理总汇编指令集合.docx_第8页
第8页 / 共18页
微机原理总汇编指令集合.docx_第9页
第9页 / 共18页
微机原理总汇编指令集合.docx_第10页
第10页 / 共18页
微机原理总汇编指令集合.docx_第11页
第11页 / 共18页
微机原理总汇编指令集合.docx_第12页
第12页 / 共18页
微机原理总汇编指令集合.docx_第13页
第13页 / 共18页
微机原理总汇编指令集合.docx_第14页
第14页 / 共18页
微机原理总汇编指令集合.docx_第15页
第15页 / 共18页
微机原理总汇编指令集合.docx_第16页
第16页 / 共18页
微机原理总汇编指令集合.docx_第17页
第17页 / 共18页
微机原理总汇编指令集合.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

微机原理总汇编指令集合.docx

《微机原理总汇编指令集合.docx》由会员分享,可在线阅读,更多相关《微机原理总汇编指令集合.docx(18页珍藏版)》请在冰点文库上搜索。

微机原理总汇编指令集合.docx

微机原理总汇编指令集合

微机原理及接口技术常用编指令

一.寄存器(用来存放存储单元的段地址或偏移地址、参与运算的数据、状态标志等)相关指令

8086CPU中有14个16位的寄存器,这14个寄存器按照功能分为四类:

通用寄存器、段寄存器组、指令指针、标志位寄存器FR。

1.通用寄存器(8个)

㈠数据寄存器:

①AX(accumulator):

寄存器(累加器)它的由来来源于EAX寄存器(32位):

EAX累加寄存器EAX分为高16位和低16位。

其中低16位又可单独访问,命名为AX,16位寄存器AX又可单独访问,可分为高、低分别为AH、AL字节个8位。

AX常用于运算;在乘法和除法中指定用来存放操作数,另外所有的I/O指令都使用这一个寄存器与外接设备传送数据。

②BX(base):

基址寄存器,寄存器(基址寄存器)它的由来来源于EBX寄存器(32位):

EBX累加寄存器EBX分为高16位和低16位。

其中低16位又可单独访问,命名为BX,16位寄存器BX又可单独访问,可分为高、低分别为BH、BL字节个8位。

BX常用于地址索引,查表和间接寻址时存放基地址。

③CX(count):

计数寄存器,寄存器(计数寄存器)它的由来来源于ECX寄存器(32位):

ECX累加寄存器ECX分为高16位和低16位。

其中低16位又可单独访问,命名为CX,16位寄存器CX又可单独访问,可分为高、低分别为CH、CL字节个8位。

常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.

④DX(data):

数据寄存器,寄存器(数据寄存器)它的由来来源于EDX寄存器(32位):

EDX累加寄存器EDX分为高16位和低16位。

其中低16位又可单独访问,命名为DX,16位寄存器DX又可单独访问,可分为高、低分别为DH、DL字节个8位。

常用于数据传递。

㈡指针和变址寄存器

这些寄存器存放的是段内的偏移量,用来形成操作数的存储地址。

SP(StackPointer):

堆栈指针,与SS配合使用,可指向目前的堆栈位置,SP指向栈顶。

BP(BasePointer):

基址指针寄存器,可用作SS的一个相对基址位置,BP指向栈的任何一单元。

SI(SourceIndex):

源变址寄存器可用来存放相对于DS段之源变址指针。

DI(DestinationIndex):

目的变址寄存器,可用来存放相对于ES段之目的变址指针,指令中SI对应DS,DI对应ES不能互换。

2.指令指针IP(InstructionPointer)(1个)

16位的指令指针IP,用来存放下一条指令在CS(代码段寄存器)中的偏移量。

当发现中断或调用时BIU【(BusInterfaceUnit)总线部件,功能是取指令、读操作数和送出结果】自动将IP的偏移量压入堆栈保存,并调整IP的内容。

程序不能直接访问IP,但可以通过中断、转移等指令来修改IP的内容。

3.段寄存器(SegmentRegister)(4个)

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

CS(CodeSegment):

代码段寄存器;存放当前执行的指令在内存中的地址段。

CS和IP决定了当前指令的逻辑地址。

DS(DataSegment):

数据段寄存器;存放当前数据段的段地址。

DS和SI决定了字符串操作时目的操作数的地址。

SS(StackSegment):

堆栈段寄存器;存放当前数据段的堆栈地址,SS与SP决定了当前堆栈的顶部,所谓堆栈是以“后进后出”规则保存信息的一种存储机构。

8086CPU的堆栈段地址在SS寄存器中,堆栈当前偏移地址在SP寄存器中,SP的初值代表了堆栈区的大小。

ES(ExtraSegment):

附加段寄存器。

附加段是一个附加的数据段。

ES和DI决定了字符串操作时目的操作数的地址。

 4.标志位寄存器FR(FlagRegise)

8086CPU设置了一个16位的标志寄存器FR,用来显示微机的运行结果或控制机制操作,规定了其中的9位,标志的设置,FR的九个标志按作用可分为两大类:

一类叫状态标志,用来表示运算结果的特征,他们是:

CF、PF、AF、ZF、SF、OF。

另一类叫做控制标志,用来控制CPU的操作,它们是:

IP、DF、TF。

CF(carrierflag)进位标志位:

运算中高四位中发生进位或错位时,CF=1;否则CF=0;STC指令可置CF=1,CLR指令对CF求反;循环指令也会影响该标志位。

DF(directionflag)方向标志位:

控制串指令对字符串处理的方向。

DF=0时,变址地址指针SI、DI作增量操作,即由低地址向高地址进行串操作,字节操作增量为1,字操作增量为2;DF=1时,作减量操作,即由高地址向低地址进行串操作。

STD指令可置DF=1,CLD指令置DF=0。

OF(overflowflag)溢出标志位:

当运算结果超出机器的的表示范围时OF=1;否则为0;存在以下几种情况可称之为溢出【即使OF=1】两个正数相加得到一个负数;l两个负数相加得到一个正数;两个相同符号的数相乘得到一个负数;两个异号的数相乘得到一个正数。

PF(parityflag) 奇偶校验位:

当运算结果的低8位中1的个数为偶数时,PF=1;否则PF=0;

AF(auxiliaryflag)辅助进位标志:

在运算结果的低4位向高4位有进位(加法)或有错位(减法)时,AF=1否则AF=0.该标志一般在BCD码运算中作为是否进行十进制调整的判断。

ZF(zeroflag)零标志位:

结果为0,ZF=1,否则ZF=0.

SF(signflag)符号标志位:

在进行有符号运算数的算术运算,当运算结果为负时SF=1,否则为0。

IF(interruptflag)中断允许标志位:

控制可屏蔽中断的标志。

当IF=1时,允许CPU响应屏蔽中断请求;当IF=0时,禁止响应。

TF(trapflag)陷阱标志位:

这是为程序调试而提供的CPU单步工作方式。

TF=1时,CPU每执行完一个条指令就产生一个内部中断,以便对每一个指令的执行结果进行跟踪调查。

二、数据传送指令

1、数据传送指令

⑴通用数据传送指令

MOV(Move)数据传送。

Mov指令形式【MOVOPRD1目的操作数OPRD2源操作数】它允许在CPU的寄存器之间、存储器和寄存器之间传送字节和字数据,也可以将立即数传送到寄存器或存储器中。

功能即:

将源操作数送入目的操作数中,源操作数保持不变。

以下注意点:

立即数、代码段寄存器CS(代码段寄存器)只能做源操作数;IP(指令指针)寄存器不能作源操作数或目的操作数;MOV指令不能在两个存储单元之间直接传递数据,也不能在两个段寄存器之间直接传送数据;两个操作数的类型属性要一致。

堆栈操作指令POP(Popfromthestack)、PUSH(Pushontothestack)

堆栈是以“先进后出”方式工作的一个存储区,栈区的段地址由SS寄存器的内容确定,而栈顶位置由堆栈指针SP寄存器的内容来确定。

堆栈操作指令包括入栈(PUSH)和出栈指令(POP)指令两类。

这两条指令必须以字为操作,不能采用立即寻址方式。

入栈操作:

PUSHOPRD;OPRD为源操作数。

功能将源操作数压入堆栈。

源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字。

堆栈是以“先进后出|”的原则工作,栈区的段地址由SS寄存器的内容确定。

每一次执行PUSH的步骤为:

首先修改SP的值,SP=SP-2;低位字节地址在较低地址单位【SP】=OPRD低8位;高字节放在较高地址单位,【SP+1】=OPRD高八位。

由于堆栈操作都是以字为单位进行的,所以SP总是指向偶地址单元。

出栈操作:

POPOPRD;OPRD为目的操作数。

将当前SP所指向的堆栈顶部的一个字送到指定目的操作数中。

目的操作数可以是16位通用寄存器、段地址寄存器或存储单元,但CS不能做目的操作数。

每执行一次POP指令后,SP=SP+2,即SP向高地址方向移动,指向栈顶。

数据交换指令XCGH(Exchange)

XCGHOPRD1【目的操作数】OPRD2【源操作数】把一个字节或一个字的源操作数和目的操作数相互交换。

交换能在通用寄存器与累加器之间、通用寄存器与存储器之间进行。

但段寄存器和立即数不能作为一个操作数,也不能在累加器之间进行。

2.累加器专用传送指令

字节交换指令XLAT(Translate) 

XLAT[转换表];换码。

用查表方式将一种代码。

XLAT指令有两种格式,第一种格式中的“转换表”为表格的首地址,一般为符号表示,以提高程序的可读性,但它也可以省略,即用第二种格式。

使用XLAT指令时,要求BX寄存器指向该表的首地址,AL中为表中某一项与表格首地址之间的偏移量。

指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所得对应的存储器单元中的数值读送到AL中去。

该指令是通过查表方式来完成翻译功能的。

因此,在执行该指令之前,必须在内存中建立好一张翻译表,该表的最大容量为256个字节。

输入输出指令IN(input)/OUT(output)

输入指令格式:

INAL,端口地址[N];

INAX,端口地址[N+1][N];

INAL,DX;

INAX,DX;

说明:

从I/O端口输入数据至AL/AX,允许一个字节由一个输入端口传送到AL中,或者把一个字由一个输入端口传送到AX中,若端口地址超过256(00~FFH),则需用DX寄存器来保存该端口地址,这样用DX作端口地址时,最多可寻址64K(0000~FFFFH)。

输出指令格式:

OUTAL,端口地址[N];

OUTAX,端口地址[N+1][N];

OUTDX,AL;

OUTDX,AX,

说明:

将AL或AX的内容输出至I/O端口。

可将AL和AX中的内容传送到一个输出端口,端口寻址方式与IN指令相同。

3.有效地址传送寄存器指令

LEA(Loadeffectiveaddress)      有效地址送寄存,格式:

LEAOPRD1,OPRD2。

把源操作数的偏移地址传送到目的操作数。

LDS(LoadDSwithPointer)       指针送寄存器和DS。

格式:

LDSOPRD1,OPRD2。

功能:

完成一个地址指针的传送。

地址指针包括偏移地址和段地址,它们已分别存放在由源操作数给出最低地址的四个连续存储单元中(即存放了一个32位的双子数据),指令可将该数据的高16位(段地址)送入到DS,低16位(偏移地址)送入目的操作数所指出的一个16位通用寄存器或者是变址寄存器。

LES(LoadESwithPointer)        指针送寄存器和ES。

格式:

LESOPRD1,OPRD2功能:

这条指令除将地址指针的段地址送入ES外,与LDS类似。

4.标志寄存器传送指令

LAHF(LoadAHwithflags)        标志寄存器8位送AH。

将标识为位低8位的的数据传至AH寄存器

SAHF(storeAHintoflags)         AH送标志寄存器8位。

该条指令与LAHF指令的操作相反,可以将寄存器AH的内容送至标志寄存器的低8位。

  PUSHF(pushtheflags)            标志进栈。

将标志寄存器的内容压入堆栈顶部,同时修改堆栈指针,但不影响标志位。

 POPF(poptheflags)               标志出栈。

把当前堆栈顶部的一个字,传送到标志寄存器,同时修改堆栈指针,影响标志位。

二、算术指令

    1.加法指令

ADD(add)加法格式:

ADDOPRD1,OPRD2。

功能:

完成两个操作数相加,结果送至目的操作数OPRD1,源操作数OPRD2不变。

目的操作数可以是通用寄存器以及存储器,源操作数可以是通用寄存器、存储器或立即数。

这条指令对标志位CF、OF、PF、SF、ZF和AF有影响。

注意:

源操作数和目的操作数不能同时为存储器,而且它们的类型必须一致,即同为字或字节。

ADC(addwithcarry)带进位的加法指令。

格式ADCOPRD1,OPRD2.功能这条指令类似,只是在两个操作数相加时,要把进位标志位CF的现行值加上去,结果送至目的操作数OPRD1。

ADC指令主要用于多字节运算中。

这条指令对标志位的影响与ADD相同。

INC(increment)自增指令。

格式:

INCOPRD。

功能:

完成对指定的操作数OPRD加1,然后返回操作数。

此指令主要用于在循环程序中修改地址指针和循环次数等。

这条指令执行结果影响标志位AF、OF、PF、SF和ZF,对地址标志位CT没有影响。

2.减法指令

       SUB(subtract)                        减法。

格式:

SUBOPRD1,OPRD2功能:

完成两个操作数相减,从OPRD1中减去OPRD2,结果放在OPRD1中即目的数中。

       SBB(subtractwithborrow)         带借位减法。

格式:

SBBOPRD1,OPRD2,指令功能,两个数相减时,发生借位现象,还要减去借位标志位CF的当前值,本指令对标志位AF、CF、OF、SF、PF、ZF都有影响。

       DEC(Decrement)                    减1。

格式DECOPRD。

功能:

对指令的操作数减去1,然后送回此操作数OPRD中。

       CMP(Compare)                       比较 。

比较指令主要是比较两个数的大小关系,在比较指令之后,可根据CF、ZF、OF等标志位来判断两者大小关系,只改变标志位,不改变目的操作数。

3.乘法指令

MUL(UnsignedMultiple)           无符号数乘法。

格式:

MULLOPRD;OPRD为源操作数。

A)     8位乘法,内容放在AX

B)     16位乘法,内容放在DX(高8位)AX(低8位)

IMUL(SignedMultiple)            带符号数乘法。

格式:

IMULOPRD;OPRD为源操作数。

    乘法不允许使用立即数,除非是带符号的立即数乘法。

4.除法指令

DIV(Unsigneddivide)              无符号数除法

IDIV(Signeddivide)                 带符号数除法,该指令认为最高位为符号位。

在进行除法运算中,在字节运算时被除数在AX中,运算结果商在AL中,余数在AH中。

字运算时被除数为DX;AX构成的32位数,运算结果商在AX中,余数在DX中。

A)     8位商AL余数AH

B)     16位商AX余数DX

C)     除以0,或者溢出均错误

5.符号扩展指令

CBW(Convertbytetoword)       字节转换为字(有符号数)格式:

CBW,将AL中字节数的符号位扩展到AH的各个位,形成AX中的数据。

CWD(Contertwordtodoubleword)   字转换为双字(有符号数)格式:

CWD,将AX中字数据的符号位扩展到DX中的各个位,形成DX和AX中的双字数据。

6.BCD调节指令【此处的BCD是指数字的表现形式采用的是BCD码即16进制】

组合BCD数格式:

DAA或DAS功能:

组合数BCD数的加法/减调整指令,半字节1位BCD相加/减,超过9或有进位/有错位,要加6进行调整/减6进行调整。

若低半字节调整后有进位,则高半字节在做,加6进行调整。

分离BCD数格式AAA:

分离BCD数的加法调整指令,只取低半字节,其余同DAA指令。

格式AAS分离BCD数的减法调成指令,只取低半字节,其余同DAS指令。

格式AAM分离BCD数的乘法调整指令,两个BCD数相乘,结果在AL中,除以10后的商在AH中,余数在AL中。

格式AAD分离BCD数的除法调整指令,先将两个BCD码转换为一个字节二进制数(高位*10+低位)得到被除数,放于AL中,AH清零,运算后,商送AL,余数送AH。

7

三、逻辑指令

1.逻辑运算指令

AND(and)                      逻辑与,可用于清1

OR(or)                         逻辑或,可用于清0

NOT(not)                     逻辑非,按位取反即可

XOR(exclusiveor)                  异或

NEG取反指令,即用零减去操作数,再把结果送回操作数中。

TEST测试指令。

格式:

TESTOPRD1,OPRD2功能:

完成AND指令相同的操作,结果只影响标志位,不改变目的操作数。

通常使用它进行数据中某些位是1或是0的测试。

符合测试要求则转移。

2.移位指令

SHL(shiftlogicalleft)               逻辑左移。

SAL(shiftarithmeticleft)         算术左移。

格式:

SHL/SALOPRD1,移位次数。

功是将OPRD1中的8位或16位移动若干位(如果没给出移位次数,则默认向做移动一位;如果给出移动位次数,则向做移动CL位)最左边位(即最高位)或者最后移出位至CF,最右边的1位(即最低位)或右边的CL位移入0。

SHR(shiftlogicalright)              逻辑右移

SAR(shiftarithmeticright)           算术右移。

格式:

SHR/SAROPRD1,移位次数。

功是将OPRD1中的8位或16位移动若干位(如果没给出移位次数,则默认向右边移动一位;如果给出移动位次数,则向右移动CL位)最右边位(即最低位)或者最后移出位至CF,最左边的1位(即最高位)或右边的CL位移入0。

算数移位和逻辑移位的最区别:

逻辑移位用于无符号数算术移位用于有符号数。

逻辑右移将数字右移高位补0;算术右移将数字右移高位补原来最高位的数。

逻辑和算术左移都是将数字左移低位补0。

ROL(Rotateleft)                     循环左移。

ROR(Rotateright)                   循环右移格式:

ROL/ROROPRD1功能:

将OPRD1中的8位或16位二进制数向左/向右移动,移位次数。

(如果没给出移位次数,则默认向做移动一位;如果给出移动位次数,则向做移动CL位),从左边/右边移出位既移入CF又移入右边/左边的空出位,最后移出位移至最右边位(即最低位)/最左边位(即最高位),同时保留在CF。

RCL(Rotateleftthroughcarry)    带进位循环左移

RCR(Rotaterightthroughcarry)  带进位循环右移。

格式:

RCR/RCLOPRD1,移位次数。

将OPRD1和进位CF中的9位或17位二级制数一同向右移/左移1位或CL位,最右/左边位(即最低/高位)或者最后移出位至CF,CF(原内容)移至OPRD1的最左边/最右边或者是中间。

四、串处理指令

1.重复前端指令

虽然字符串指令只允许一次处理一个字节或一个字数据,但是你字符串操作指令前均可以加REF指令重复前缀,以实现对字符串中数据的重复处理。

指令重复前缀包括无条件指令重复前缀PER、条件指令重复前缀REPE/REPZ与REPNE/REPNZ,它们必须置于字符串指令之前,其间用空格间隔,不能单独使用。

使用指令重复前缀,还必须先将重复的次数送入CX。

每执行一次字符串操作指令,CX自动减1,直到CX=0时终止重复。

方向标志位决定重复运算的方向:

(1)使用CLD指令,设定DF=0;寄存器SI、DI由低地址到高地址变化。

(2)使用STD指令,设定DF=1;寄存器SI、DI由高到低地址变化。

使用指令重复前缀的一般格式位:

REP(Repeat)      REPC(Repeatwhencarryflag)

重复串操作直到(CX)=0为上。

无条件的重复前缀指令。

REP将使得紧跟其后的字符串操作指令无条件地重复执行CX寄存器中内容指定的次数,直到cx=0为止。

它通常用在字符串传送指令(MOVS)、字符串存储指令(STOS)之前。

若CX的初值为0,则字符串指令一次也不执行。

REPNZ(Repeatwhennotzeroflag)EPNE(Repeatwhennotempty)

REPNC(Repeatwhennotcarryflag)

字符串比较指令CMPS与字符串扫描指令SCAS也会影响状态标志,使指令的执行在指定的条件下能够立即停止。

为配合此目的,REP还有两种条件重复形式:

REPE和REPNE。

与REPE配合使用的指令有以下4种格式

REPE(Repeatwhenempty)    若(CX)=0,则退出,否则CX=CX+1;

REPZ(Repeatwhenflag)     若ZF=0,则退出,否则CX=CX+1;

2.串操作指令。

字符串操作指令的实质是对一片连续的存储单元进行处理,这片连续的存储单元由隐含指针DS:

SI或ES:

DI来指定;字符串操作指令可对内存单元按照字节、字、双字进行处理,并能根据操作对象的字节数使变址寄存器SI/DI增加或减少1、2、4字节;

规定如下:

A.当DF=0时,变址寄存器SI/DI增加1、2、4字节;即:

变址寄存器SI/DI递增的步长可以是1、2、4字节;

B.当DF=1时,变址寄存器SI/DI减少1、2、4字节;即:

变址寄存器SI/DI递减的步长可以是1、2、4字节;

取字符串数据指令(LoadStringInstruction)

从指针DI:

SI所指定的内存单元开始,取一个字节/字/双字,然后存入到AL/AX/EAX中,并根据标志位DF的值对寄存器SI做相应的增减;把存放字符串数据的连续存储区当做是数据源,使用寄存器SI;

该指令的执行不会影响任何标志位;

指令格式:

  LODSB/LODSW 地址表达式

                LODSD        地址表达式;80386+

在指令LODS中,它会根据"地址表达式"的属性来决定读取一个字节、字或双字;即:

当该地址表达式的属性为字节、字或双字时,将从指针DI:

SI处读取一个字节到AL中,或读取一个字到AX中,或读取一个双字到EAX中,与此同时,SI还将分别增减1、2、4字节;

取字符串数据指令的功能示意图如下图所示:

置字符串数据指令(StoreStringInstruction)

该指令把寄存器AL/AX/EAX中的值存入指针ES:

DI所指向内存单元开始的一片存储单元中,并根据标志位DF的值对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地,使用寄存器DI;

该指令的执行并不会影响任何标志位;

指令格式:

 

               STOSB/STOSW地址表达式

               STOSD      地址表达式;80386+

置字符串数据指令的功能示意图如下图所示:

字符串传送指令(MoveStringInstruction)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2