汇编语言指令集.docx
《汇编语言指令集.docx》由会员分享,可在线阅读,更多相关《汇编语言指令集.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言指令集
汇编语言程序设计
1.18086微处理器的寻址方式
为了找到操作数所存放的位置的操作成为寻址方式。
8086汇编语言共有四种寻址方式。
8086CPU内部寄存器可用助记符表示如下:
8位寄存器名称;
AL,AH,BL,BH,CL,CH,DL,DH.
16位寄存器名称;
AX,BX,CX,DX,SI,DI,SP,BP.
段寄存器名称:
CS,DS,ES,SS。
3.2.1立即数寻址
立即数寻址方式指令中包含有操作数,此类指令一般用于对CPU中的寄存器赋值。
例如:
MOVAL,8;将8位数据送到寄存器AL中
MOVAX,16H;将16位的数据0016H送到寄存器AX中,因为AX寄存器
;是16位的,它由AH和AL组成,执行这条指令后AH中内
;容为00,AL中内容为16H。
所以(AX)=0016H
立即数寻址的特点是数据直接在指令中给出,操作直接在CPU中进行,不需要总线周期。
3.2.2寄存器寻址
寄存器寻址指操作数在指令的寄存器中。
此类指令的操作都在CPU内部的寄存器中进行,所以执行时间短。
例如:
ADDAL,BL;把寄存器AL中内容和寄存器BL中内容相加的结果送AL寄存器
寄存器寻址的特点是,操作在CPU的寄存器间进行,不需要总线周期。
3.2.3直接寻址
直接寻址指操作数在CPU外部的存储器中.需要通过数据总线才能把数据取出进行操作。
例如:
MOVAL,[2010];把内存2010单元中的内容送到CPU的AL寄存器中
直接寻址的特点是指令中有个操作数在内存中,指令执行时需要总线周期操作。
3.2.4寄存器间接寻址
寄存器间接寻址指操作数以寄存器中的内容作为地址指向内存的某一单元。
例如:
MOVAL,[BX];以BX中的内容作为内存单元的地址,把该内存单元中的
可用于寄存器间接寻址的寄存器为BX,BP,DI,SI.
3.38086汇编指令系统
3.3.1可执行指令
1,传送类指令
传送指令用于实现CPU个寄存器之间,CPU的各寄存器和存储器之间,CPU的各寄存器和输入/输出的个端口之间进行数据传递。
除了取标志指令外,传送类v执行后不对标识寄存器产生影响。
1)基本转移类指令
指令形式;MOVDST,SRC;
功能:
SRC内容送到DST中。
SRC可以是常数、CPU中的寄存器、内存地址。
DST可以是CPU中的寄存器、内存地址,但不能是代码段寄存器CS或指令指针IP。
8086CPU中的寄存器可以按8位方式,也可以按16位方式操作,传送语句中的源操作数和目的操作数的位数必须一致。
如果要把一个常数传送到存储器中,必须用伪指令WORDPTR或BYTEPTR来指定要传送的常数是以字节(8位)还是字(16位)方式传送。
源操作数和目的操作数不允询同时为存储器地址。
不允许向段寄存器或指令指针直接传送数据。
如果耍向除CS外的寄存器传送数据,可以通过CPU中的其他寄存器进行。
例如:
MOVAX,1024;先把常数送到AX寄存器,
MOVDS,AX;然后再把AX寄存器中的数据送入DS
用DI、SI和BX作间接寻址时,默认的段寄存器为数据段寄存器DS,用BP作间接寻址时,默认的段寄存器为SS。
2)堆栈操作指令PUSHSRC;POPDST;
堆栈是内存中的一块区域,该区域可定位在内存的任何地方,地址由堆栈段寄存器SS和堆栈指针SP决定。
堆栈按先进后出(或后进先出)方式工作。
指令形式:
PUSHSRC
POPDST
功能:
PUSH指令用于把源操作数中的内容压到堆栈中,具体过程为:
SP=(SP)-2,(SRC)-[SP],即:
先把堆栈指针SP寄存器中的内容减2后送回到SP寄存器中,再把源操作数SRC中自内容送到由Ss和SP构成的内存单元中;POP指令用于把堆栈中内容弹出到目的操作数中,具体过程为;[SP]--DST,SP=(SP)+2,即:
先把由SS寄存器和堆栈指针SP寄存器构成的内存单元中的内容送到DST中,然后把SP中的内容加2后送回到SP中。
SRC和DST可以是寄存器或存储器,DST不允许用CS,SRC和DST都必须是16位的操作。
3)交换指令XCHGDST,SRC;
功能:
把DST和SRC中的内容交换
SRC和DST不能同时为内存的地址,也不可以是CS或IP寄存器。
4)换码指令XLAT功能:
把BX和AL中的内容相加后作为内存的地址,然后把该地址所指向的内存单元中的内容取到AL寄存器中去。
5)取地址指令
LEADST,SRC;LEA指令用于把SRC所指向的内存地址的偏移量取到DST中LDSDST,SRC;LDS指令用于把SRC内存地址的第一个字取到DST中,并将内存地址的第二个字取到DS寄存器中;
LESDST,SRC;LES指SRC所指向的内存地址的第一个字取到DST中,并将内存地址的第二个字取到ES寄存器中。
6)取标志指令LAHFSAHFPUSHFPOPF
功能:
LAHF把标志寄存器的低8位取到AH,标志寄存器中的各位位置与AH各位位置对应。
SAHF把AH内容送到标志寄存器的低8位;标志寄存器中的各位位置对应
PUSHF把标志寄存器的值压入堆栈:
SP值的变化和PUSH指令类似。
POPF把堆栈顶部的值弹出到标志寄存器中,SP值的变化和POP指令;
2.算术类指令
算术类指令用作加、减、乘、除运算。
参加运算的数据都按整数对待。
指令执行后将根据运算结果改变标志寄存器中的某些标志位。
标志位改变的基本规律如下:
如果运算结果等于0,则ZF=1。
如果运算结果为负数,则SF=1。
如果运算结果中有偶数个1,则PF=l。
当有符号数运算产生溢出,则OF=1。
当无符号数运算产生溢出,则CF=I。
当无符号数相减,被减数小于减数时,CF=1。
1)不带进位位的加法指令
指令形式:
ADDDST,SRC
功能:
SRC内容和DST内容相加,结果送到DST中。
2)不带进位位的减法指令SUB
指令形式:
SUBDST,SRC
功能:
SRC内容和DST内容相加,结果送到DST中。
3)带进位位的加法指令ADC
指令形式:
ADCDST,SRC
功能:
SRC内容和DST内容相加后再加标志位CF内容,结果送到DST中。
4)带借位位的减法指令SBB
指令形式:
SBBDST,SRC
功能:
SRC内容和DST内容相减后再减标志位CF内容,结果送到DST中。
5)增1指令INC
指令形式:
INCDST-SRC
功能:
DST-SRC内容加1后结果送到DST-SRC中。
6)减1指令DEC
指令形式:
DECDST-SRC
功能:
DST-SRC内容减1后结果送到DST-SRC中。
7)无符号数乘法指令
指令形式:
MULSRC;(AL)*SRC--AX(AX)*SRC--DX,AX
8)带符号数乘法指令
指令形式:
IMULSRC;(AL)*SRC--AX(AX)*SRC--DX,AX
9)无符号数除法指令
指令形式:
DIVSRC;(AX)/SRC---AXAL商AH余(DX)(AX)/SRC=DX,AXAX商,DX余数
10带符号数除法指令
指令形式:
IDIVSRC;(AX)/SRC---AXAL商AH余(DX)(AX)/SRC=DX,AXAX商,DX余数
11)BCD码运算指令P97指令形式AAAAASDAADASAAMAAD
BCD码在计算机中有两种表示方法:
一种用8位二进制数表示2位BCD码,如01100111,称为组合BCD码;另一种用8位二进制数的低4位表示1位BCD码,如00000111,称为非组合BCD码。
由于计算机的运算指令都是按二进制的形式进行,所以在对用BCD码表示的数算时,必须进行必要的处理,也叫调整。
指令形式:
AAA
AAS
DAA
DAS
AAM
AAD
功能:
AAA用于非组合的BCD加法的调整;AAS用于非组合的BCD减法的调整;DAA用于组合的BCD加法的调整;DAS用于组合的BCD减法的调整;AAM用于非组合的BCD乘法的调整;AAD用于非组合的BCD除法的调整。
12)比较指令CMPDST,SRC;
指令形式:
CMPDST,SRC;
功能:
把DST内容减去SRC内容,结果不送回到DST。
该指令与SUB指令相似,不同点在于不把结果送到目的操作数。
3.逻辑运算和移位类指令
1)逻辑运算指令
指令形式:
ANDDST,SRC;
TESTDST,SRC;
ORDST,SRC;
XORDST,SRC;
NOTDST,SRC;
NEGDST,SRC;
l送DST;TEST指令买现uM布u3K乙
功能:
AND指令实现DST和SRC按位逻辑与操作,结果送DST;TEST指令实现DST和SRC按位逻辑与操作,DST结果不变;OR指令实现DST和SRC按位逻辑或操作,结果送DST;NOT指令实现DST—SRC按位取反操作,结果送DST--SRC;NEG实现DST和SRC按位逻辑异或操作,结果送DST;
2)移位指令
(1)非循环移位指令
指令形式;SALDST,SRC;
SARDST,SRC;
SHLDST,SRC;
SHRDST,SRC;
功能:
SAL是算术左移指令,根据SRC的值K把DST中内容左移K位,每移一次,最左边的一位移入CF,最右边的位补O;SHL是逻辑左移指令,功能同SAL指令。
SAR是算术右移指令,根据SRC的值K把DST中内容右移K位,每移一次,最左边的一位除了向右移外还保持本身的值不变,即:
保持符号位不变。
最右边的一位移人CF中。
SGR是逻辑右移指令,根据SRC的值后把DST中内容右移座位,每移一次,最右边的一位移入CF中,最左边的位补0。
上面四条指令的SRC可以是常数1或寄存器CL两种形式。
常数l表示移1位,如果希望移多位,则必须用CL指定要移的位数。
上面指令的SRC可以是常数1或寄存器CL两种形式。
常数l表示移1位,如果希望移多位,则必须用CL指定要移的位数。
(2)不带进位位的循环移位指令
指令形式:
ROLDST,SRC;
RORDST,SRC;
功能:
ROL是左移指令,根据SRC的值七把DST中内容左移座位,每移一次,最左边的一位移人CF的同时也移入最右边的位中。
ROR是右移指令,根据SRC的值K把DST中内容右移K位,每移一次,最右边的一位除了移入CF的同时也移入最左边的位中。
(3)带进位位的循环移位指令
指令形式:
RCLDST,SRC
RCRDST.SRC
功能:
RCL是左移指令,根据SRC的值K把DST中内容左移K位,每移一次,最左边的一位移人CF,同时把CF移人到最右边的位中。
RCR是右移指令,根据SRC的值K后把DST中内容右移K位,每移一次,最右边的一位移入CF,同时把CF移人到最左边的位中。
4.串操作指令
串操作指令用于对内存区域中的一串数据进行操作。
源数据的地址一般在数据段中,由DS给出它的段地址,并用SI来指定它的偏移量;目的数据的地址一般在附加段中,由ES给出它的段地址,并用DI来指定它的偏移量。
串操作指令既可以对单个字节数据或单个字数据进行操作,也可以以对串操作指令加前缀的方式作连续的操作。
1)串操作前缀指令
(1)REP指令
REP指令使得串操作指令重复执行,每执行一次,CX中的内容减1,在CX中的内容减到0时才停止。
其执行步骤如下:
①如果CX=0,则退出,否则往下执行;
②cx
cx-1;
③执行REP后面的串处理指令一次;
④重复①到③。
这条指令可以和MOVS、STOS、LODS一起使用。
(2)REPE/REPZ指令
REPE和REPZ两条前缀指令的功能相同,即让串操作指令重复执行,每执行一次,CX中的内容减l,当CX中的内容减到0时停止,或者标志寄存器ZF=0时,即使CX内容没有减到0,也将停止串操作指令的执行。
其执行步骤如下:
①如果CX=0或ZF=0,则退出,否则往下执行;
②cx
cx-1;
③执行REPE/REPZ后面的串处理指令一次;
④重复①到③。
(3)REPNE/REPNZ指令
REPNE和REPNZ两条前缀指令的功能相同,即让串操作指令重复执行,每执行一次,CX中的内容减1,在CX中的内容减到0时停止,或者标志寄存器ZF=1时,即使CX内容没有减到0,也将停止串操作指令的执行。
其执行步骤如下:
①如果CX=0或ZF=1,则退出,否删往下执行;
②cx
cx-1;
③执行REPE/REPZ后面的串处理指令一次;
④重复①到③。
注意:
上述串操作前缀指令在执行前都是先做判断后执行的串操作指令。
2)串操作指令
(1)/串传送指令
指令形式:
MOVSB
MOVSW
功能:
MOVSB用于把源地址的一个字节数据送到目的地址;MOVSW用于把源地址的一个字数据送到目的地址。
如果标志寄存器中的方向标志DF=O,那么,每传送一个字节(或字)后SI和DI的内容将加1(或2),如果DF=1,那么,每传送一个字节(或字)后SI和DI的内_容将减1(或2)。
(2)串比较指令)
指令形式:
CMPSB
CMPSW
功能:
CMPSB用于把源地址的一个字节数据和目的地址的一个字节数据作比较;CMPSW用于把源地址的一个字数据和目的地址的一个字数据作比较。
如果标志寄存器中的方向标志DF=O,那么,每比较一个字节(或字)后SI和DI的内容将加1(或2);如果DF=1,那么每比较一个字节(或字)后SI和DI的内容将减1(或2)。
(3)串检索指令
指令形式:
SCASBSCASW
功能;SCASB用于把AL中的数据和目的地址的一个字节数据作比较;SCASW用于把AX中的数据和目的地址的一个字数据作比较。
如果标志寄存器中的方向标志DF=O,那么,每比较一个字节(或字)后SI和DI的内容将加1(或2);如果DF=1,那么每比较一个字节(或字)后SI和DI的内容将减1(或2)。
(4)取串指令
指令形式:
LODSBLODSW
功能:
LODSB用于把DS:
SI所指向的目的地址中的一个字节数据取到AL中;LODSW用于把DS:
SI所指向的目的地址中的一个字数据取到AX中。
如果标志寄存器中的方向标志DF=O,那么,每取一个字节(或字)后SI的内容将加1(或2);如果DF=1,那么,每取一个字节(或字)后SI的内容将减1(或2)。
(5)、存串指令
指令形式:
STOSBSTOSW
功能:
STOSB用于把AL中的内容存到ES:
DI所指向的目的地址中;STOSW用于把AX中的内容存到ES:
DI所指向的目的地址中。
如果标志寄存器中的方向标志DF=O,那么,每取一个字节(或字)后SI的内容将加1(或2);如果DF=1,那么,每取一个字节(或字)后SI的内容将减1(或2)。
5.CPU控制指令
1)方向标志操作指令CLDSTD
CLD;置DF=0
STD;置DF=1
2)进位标志操作指令CLCSTCCMC(CF取反)
CLC;置CF=O
STC:
置CF=I
CMC;CF取反,如果CF原来等于1,执行CMC指令后CF=O
3)中断允许标志操作指令CLISTI
CLI:
置IF=O,即CPU不响应外部可屏蔽中断请求
STI;置IF=1,即CPU可响应外部可屏蔽中断请求
4)停机指令HLT
HLT;CPU进入暂停状态,当有外部中断或复位时才退出暂停状态
5)空操作指令NOP
NOP;CPU不做任何操作
6.输入/输出指令
指令形式:
INAL/AX,PORT8;
INAL/AX,DX;
OUTPORT8,AL/AX;
OUTDX,AL/AX;
功能:
IN指令用于从I/O端口中读进数据,OUT指令用于把数据写到I/O端口中.AL或AX存放输入或输出的数据。
PORT8是8位的端口地址,如果外部的端口地址为16位,必须先把16位的地址送到DX,然后再用DX做间接寻址。
7.转移类指令
1)无条件转移指令
无条件转移指令有段间转移和段内转移,前者转移的范围超过64K,此时转移指令的地址中除了包含偏移地址外还包含段地址。
段间转移和段内转移又分为直接转移和间接转移,前者的地址直接包含在指令中,后者的地址由寄存器或存储器间接给出。
指令形式:
JMPDST
功能:
根据DST的形式转移到相应的程序执行。
2)条件转移指令
(1)单标志条件转移指令
指令形式:
JZ/JEDST;如果ZF=1,则转移
JNZ/JNEDST;如果ZF=O,则转移
JSDST;如果SF=1,则转移
JNSDST;如果SF=O,则转移
JCDST;如果CF=l,则转移
JNCDST;如果CF=O,则转移
JODST;如果OF=1,则转移
JNODST;如果OF=O,则转移
JP/JPEDST;如果PF=I,则转移
JNP/JPODST;如果PF=O,则转移
()用于无符号数A和B比较的转移指念。
指令形式:
JB/JNAEDST;如果A
JNB/JNEDST;如果A≥B,则转移
JBE/JNADST;如果A≤B,则转移
JNBE/JADST;如果A>B,则转移
(3)用于有符号A和B比较的转移指令
指令形式:
JL/JNGEDST;如果A
JNL/JGEDST;如果A≥B,则转移
JLE/JNGDST;如果A≤B,则转移
JNLE/JGDST;如果A>B,则转移
条件转移指令只能用于段内转移,且只能在转移指令地址范围-128-127B范围内转移。
(4)根据CX内容转移指令
指令形式:
JCXZDST;如果(CX)=0,则转移
8.子程序调用与返回指令
1)调用指令
指令形式:
CALLDST
功能:
调用DST处的子程序,子程序执行完后返回到CALL指令的下一条指令处执行。
CALL指令的目的操作数地址和JMP指令类似,也有段内直接、段内间接、段间直接和段间间接四种地址形式。
2)返回指令
指令形式:
RET
功能:
程序返回到调用此程序的CALL指令的下一条处执行。
RET指令后还可以带一个常数。
如:
RET8,它表示从堆栈弹出返回地址后SP的值再加8。
9.循环控制指令
指令形式:
LOOPDST
LOOPZ/LOOPEDST
LOOPNZ/LOOPNEDST
功能:
LOOP指令根据CX内容决定是否做循环,如果(CX)=0,则循环停止;LOOPZ/LOOPE指令执行时先使CX减l,再判断CX内容是否等于0,并且判断ZF是否为1。
如果(ZF)=0或者(CX)=0,则退出循环。
LOOPNZ/LOOPNE指令执行时先使CX减l,再判断CX内容是否等于0,并且判断ZF是否为0,如果(ZF)=1,或者(CX)=0,则退出循环。
10.中断与返回指令
1)中断指令
措令形式;INTn、
功能:
INT指令用于实现软件中断指令,CPU执行此指令时把CS、IP和标志寄存器的内容压人堆栈,并以n作为中断类型码进行中断处理。
2)中断返回指令
指令形式:
IRET
功能:
把堆栈中内容弹出到标志寄存器、IP和CS中,程序返回到被中断的程序处执行。
3.2不可执行指令
常不可执行指令不属于8086CPU指令系统,它属于汇编语言中的说明性内容,也称为伪指令。
汇编语言的编译程序利用它与可执行指令组成有规则的、结构清晰的汇编程序。
1.常量定义伪指令
指令形式:
STREQUNum
功能:
把字符串STR定义成一个数。
以后在程序中用到数值Num时,都可以用STR来代替。
2.变量定义伪指令
指令形式:
[VAR]DBNuml,[Num2],…
[VAR]DWNuml,[Num2],…
[VAR]DDNuml,[Num2],…
功能:
DB按字节形式定义变量;DW按字形式定义变量;VAR是变量名,它以英文字母开始,后跟英文字母或数字;Num是变量的值,它可以是数或字符。
伪指令中带中括号的内容可以省略。
3.存储类型定义伪
指令形式:
BYTE
WORD
DWORD
PTR
功能:
BYTE表示一个字节;WORD表示一个字;DWORD表示两个字,PTR通常和前面三条指令配合使用,指定操作数的类型。
4.标号距离定义伪指令
指令形式:
FAR
NEAR
功能:
FAR表示引用标号的段地址和偏移地址,NEAR表示引用标号的偏移地址
5.段定义伪指令
指令形式:
SEG_NAMESEGMENT
SEG_NAMEENDS
功能:
,SEG_NAME是段的名字,它和变量命名规则相同,SEGMENT表示段的开始,ENDS表示段的结束。
SEGMENT和ENDS必须配对使用,段的名字必须相同。
6.段说明伪指令
指令形式:
ASSUMESEG_NAME:
CS(或DS,ES,SS)
功能:
ASSUME伪指令用于告近汇编程序哪个段与某个寄存器相关,它只影响汇编时的假定,程序实际运行时的段寄存器值必须用指令初始化。
7.偏移地址定义伪指令
指令形式:
ORGNum
Offset
Seg
功能:
定义程序开始的偏移地址。
Offset用于加在变量前,表示变量的偏移地址。
Seg用于加在变量前,表示变量的段地址、。
8.子程序定义伪指令
指令形式:
P_NAMEPROC
P_NAMEENDP
功能:
定义子程序的开始和结束,P_NAME为子程序的名字,它和变量命名规则相同
9.程序结束伪指令
指令形式:
END
功能:
程序结束