汇编.docx
《汇编.docx》由会员分享,可在线阅读,更多相关《汇编.docx(43页珍藏版)》请在冰豆网上搜索。
汇编
第一章绪论
(数制转换、带符号数表示法、计算机系统内部结构和外部结构)
第二章Intel8088微处理器
(Intel8088微处理器的内部结构、寄存器结构、存储器结构、物理地址的计算)
第三章指令系统与寻址方式
(寻址方式、数据传送指令)
第三章指令系统与寻址方式
(算术运算指令、逻辑运算指令、移位指令)
第三章指令系统与寻址方式
(串操作指令、控制转移指令)
第四章伪指令
(汇编语言常用伪指令介绍)
第3章寻址方式和指令系统
主要内容:
本章主要介绍8086/8088寻址方式和指令系统中的部分指令。
学习要求:
熟悉掌握8086/8088指令系统常用的七种寻址方式,能够正确找出操作数的寻址方式。
熟悉掌握各类指令的特点、功能和对标志位的影响,以及正确的书写格式。
第3章寻址方式和指令系统
3.1寻址方式(重点)
3.280X86扩展的寻址方式(略)
3.3汇编指令语句格式(重点)
3.48086/8088指令系统(重点)
3.580386新增指令(了解)
3.680486新增指令(略)
3.780586新增指令(略)
3.1寻址方式
寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法
立即寻址
寄存器寻址
直接寻址
寄存器间接寻址
基址寻址
变址寻址
基址加变址寻址
相对基址加变址寻址
段默认与段跨越
3.1.1立即寻址
立即寻址方式:
操作数紧跟在操作码之后,作为指令的一部分,与操作码一起放在代码段中。
汇编格式:
n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)
功能:
操作数存放在存储器,指令下一单元的内容为立即操作数n。
图形表示:
动画演示
【例】
MOVAX,10
执行后(AX)=?
该例中源操作数为立即寻址方式,立即数为10,存放在指令的下一单元。
图形表示:
执行:
10→AX
执行后:
(AX)=000AH
3.1.2寄存器寻址
寄存器寻址方式:
操作数在指令指明的寄存器中。
汇编格式:
R其中R表示寄存器名。
功能:
操作数直接存放在寄存器R中。
图形表示:
R
指令→操作数
动画演示
【例】
下列程序执行后,(AX)=?
,(BX)=?
MOVAX,1234H
MOVBX,5678H
ADDAX,BX
该程序中MOV指令为数据传送指令操作符,ADD指令为加法指令操作符,三条指令皆为双操作数指令。
第一、二条指令AX、BX皆为目的操作数地址,为寄存器寻址方式。
第三条指令中,AX为目的操作数地址,BX为源操作数地址。
源地址和目的地址皆为寄存器寻址方式。
图形表示:
执行:
1234H→AX
5678H→BX
(AX)+(BX)→AX
执行后:
(AX)=68ACH,(BX)=5678H
3.1.3直接寻址
汇编格式:
①含有变量的地址表达式。
②段寄存器名:
[EA]。
功能:
指令下一字单元的内容是操作数的偏移地址EA。
图形表示:
【例】
【例】寄存器和存储器内容为:
(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。
执行指令:
MOVAX,BUF
执行后:
(AX)=?
图形表示:
执行:
(32000H)→AX
执行后:
(AX)=4545H
3.1.4寄存器间接寻址
寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,操作数在存储器中。
汇编格式:
[R]
功能:
操作数存放在存储器,寄存器R存放操作数的偏移地址EA。
执行指令:
MOVAX,[BP]
执行后:
(AX)=?
,(BP)=?
,(SS)=?
,(20030H)=?
图形表示如下:
3.1.5基址寻址
基址寻址:
偏移地址是指令中给定的偏移量和寄存器BX或基数指针BP的内容之和。
3.1.6变址寻址
变址寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。
汇编格式:
X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)
功能:
操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。
图形表示如下:
偏移地址EA计算方法如下:
【例】
设执行前:
(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H
执行指令:
ADD6[BX],AX
执行后:
(AX)=?
,(BX)=?
,(DS)=?
,(20036H)=?
图形表示如下:
3.1.7基址变址寻址
基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项之和,操作数在存储器中。
汇编格式:
X[BR+IR]
功能:
操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。
图形表示:
操作数偏移地址EA计算方法如下
1.1.8相对基址变址
基址变址方式的一种扩展
如:
MOVAX,[BX+SI+10]
3.1.9段默认与段跨越
按前述规定:
若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。
该规定为系统默认状态。
当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。
汇编格式:
段寄存器名:
操作数地址。
功能:
段寄存器名指明操作数属哪个段。
【例】跨段前缀示例。
MOVAX,DS:
[BP]
MOVCX,SS:
[SI]
该例中,DS:
,SS:
均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。
上述2条指令的源操作数物理地址分别为:
PA1=(DS)左移4位+[BP]
PA2=(SS)左移4位+[SI
3.280X86扩展寻址方式
鉴于扩充的存储器结构和多方式的存储器管理方式,寻址方式较8086/8088有一定的增强
32位通用寄存器作寄存器间接寻址
3.3汇编指令语句格式
一般情况下,汇编语言的语句可以由以下几部分组成:
[标号:
]指令助记符[目的操作数][,源操作数][;注释]
3.3.1标号:
表示本条语句的符号地址。
在汇编语言中,标号、内存变量名、子程序名和宏名等都是标识符,由字母、数字及规定的特殊字符(?
、@、_、$)等组成,并且不能用数字开头。
汇编语言不区分标识符中字母的大小写。
要求标识符尽可能取得有点含义,这会大大改善程序的可读性,并有助于对程序的理解。
但标识符不能是汇编语言的保留字,保留字主要是指:
指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。
例如:
MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而a1、ah、mov等就不是合法。
试比较ABCDH和0ABCDH之间的差异。
前者是标识符,而后者是十六位进制数值。
3.3.2指令助记符
汇编指令的符号代码。
如MOV,系统使用内部对照表将每条指令的助记符译成对应的机器码
3.3.3目的操作数
是操作符的操作对象。
操作符在完成相应的操作时要求有一系列的操作数。
当有两个或两个以上的操作数时,各操作数之间用逗号隔开。
作用:
1参与指令操作
2暂存操作结果
3.3.4源操作数如加数,减数
3.3.5注释
以“;”开头的说明部分,可以用英文或者中文书写。
注释字段是语句的非执行部分。
3.48086/8088指令系统
数据传送类指令
算术运算类指令
位操作类指令
串操作类指令
程序控制转移类指令
处理器控制类指令。
3.4.1数据传送类指令
通用数据传送指令
地址传送指令
标志传送指令
累加器专用指令
1通用数据传送指令
传送指令MOV
压栈指令PUSH
出栈指令POP
数据交换指令XCHG
1.传送指令MOV
语句格式:
MOVOPD,OPS
功能:
将源操作数传送入目的地址,源地址内容不变。
即(OPS)→OPD。
下图描述了MOV指令在传送数据时允许传送的路径及类型。
【例】存储器与寄存器间数据传送。
MOVAX,BUF;BUF是变量,源操作数为直接寻址
MOVBH,[DI];源操作数为寄存器间接寻址
MOVDI,ES:
3[SI];源操作数为变址寻址,使用跨段前缀
MOVBP,3[BX+SI];源操作数为基址加变址寻址
MOVBUFA,DL;BUFA是一字节变量
MOV[BP],AX;使用SS段寄存器
MOVDS:
[BP],DL;使用跨段前缀
MOVBUF,DS;BUF是个字变量
MOVES,BUF
注意
立即数的长度必须小于等于目的操作数的长度
如:
小于目的操作数时,高位按符号位扩展
MOVAX,4BH;(AX)=004BH
操作数分别位寄存器时,长度必须一致
CS,IP寄存器不能作DST操作数,不能用立即数直接为段寄存器赋值
不允许两个操作数都是存储器操作数MOV[100H],[BX]
立即数不能作目的操作数
不能将一个的内容直接送到另一段寄存器中
MOVAX,ES
MOVDS,AX
2堆栈操作指令
1.进栈指令PUSH
2.出栈指令POP
1.进栈指令PUSH
语句格式:
PUSHOPS
功能:
将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。
即:
①(SP)-1→SP(OPS)15~8→[SP]
②(SP)-1→SP(OPS)7~0→[SP]
例:
PUSHSI
PUSHCS
PUSH[1000H]
2.出栈指令POP
语句格式:
POPOPD
功能:
将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。
从POP指令功能可看出,该指令为PUSH指令的逆过程。
即:
①([SP])→(OPD)7~0(SP)+1→SP
②([SP])→(OPD)15~8(SP)+1→SP
例POPDS
POPBP
POPDX
POP[SI]
堆栈操作动画
4.数据交换指令XCHG
语句格式:
XCHGOPD,OPS
功能:
将源地址与目的地址中的内容互换。
即(OPD)→OPS,(OPS)→OPD。
【例】寄存器与存储器之间数据交换。
MOVAX,5678H;(AX)=5678H
MOVBX,0FFFFH;(BX)=0FFFFH
XCHGAX,BX;(AX)=0FFFFH,(BX)=5678H
2.地址传送指令
LEA(LoadEffectiveAddress)装载有效地址
LDS(LoadDSwithPoint)装载偏移地址及数据段指针
LES(LoadESwithPoint)装载偏移地址及附加数据段指针
方便开辟和激活新的数据段和附加段
1.传送偏移地址(有效地址)指令LEA
语句格式:
LEAOPD,OPS
功能:
主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。
【例】主存偏移地址的获取。
MOVBX,0100H;(BX)=0100H
MOVSI,0210H;(SI)=0210H
LEABX,1234[BX+SI];(BX)=1544H
区别:
LEA,MOV
MOVAX,[1000H]
LEAAX,[1000H]
2.传送偏移地址及数据段首址指令LDS
语句格式:
LDSOPD,OPS
功能:
将当前数据段中双字数据(数据段地址指针)装入到(通常为指针寄存器和变址寄存器)SI(低字)和段地址送入DS(高字)
例:
装载指针指令
BUFDW4100H,3000H
LDSSI,BUF;(SI)=4100H,(DS)=3000H
演示
3.传送偏移地址及附加数据段指令LES
语句格式:
LESOPD,OPS
操作:
(OPS)→OPD,(OPS+2)→ES。
功能:
将主存某字单元内容送指定寄存器。
例:
当前(DS)=1000H,(BX)=0020H,
(10020H)=405BH,(10022H)=4000H
则执行LESDI,[BX]
(ES)=4000H,(DI)=405BH
3.标志寄存器传送指令
1.标志送AH指令LAHF
2.AH送标志指令SAHF
3.标志寄存器进栈指令PUSHF
4.标志寄存器出栈指令POPF
1.标志送AH指令LAHF
语句格式:
LAHF
功能:
将标志寄存器的低8位送入AH寄存器。
即(FLAGS)7-0→AH。
该指令的执行对标志位无影响。
【例】标志寄存器传送。
执行前:
(FLAGS)=0485H,(AX)=0FFFFH
执行指令:
LAHF
演示
2.AH送标志指令SAHF
语句格式:
SAHF
功能:
将AH的内容送入标志寄存器的低8位,高8位不变。
即(AH)→FLAGS7-0.。
从该指令功能可看出,SAHF为LAHF的逆过程。
3.标志寄存器进栈指令PUSHF
语句格式:
PUSHF
功能:
将标志寄存器的内容压入堆栈。
即(FLAGS)→↓(SP)。
4.标志寄存器出栈指令POPF
功能:
将栈顶内容弹出送入标志寄存器中。
即↑(SP)→FLAGS。
POPF指令与PUSHF指令互为逆过程。
【例】将标志寄存器的单步标志TF置位。
PUSHF;(FLSGS)→↓(SP)
POPAX;(SP)→AX
ORAX,0100H;设置D8=TF=1
PUSHAX;(AX)→↓(SP)
POPF;(SP)→↓FLAGS,即(AX)→↓FLAGS
4.累加器专用传送指令
用于微处理器与外设之间传送信息和换码1.输入指令IN
2.输出指令OUT
3.换码指令XLAT(translatebytetoAL);从表格中取得编码
1.输入指令IN
输入指令用来从指定的外设寄存器取信息送入累加器。
它有四种形式:
(1)语句格式:
INAL,PORT
功能:
(PORT)→AL
(2)语句格式:
INAX,PORT
功能:
(PORT)→AX
(3)语句格式:
INAL,DX
功能:
([DX])→AL
(4)语句格式:
INAX,DX
功能:
([DX])→AL
2.输出指令OUT
输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:
(1)语句格式:
OUTPORT,AL
功能:
(AL)→PORT
(2)语句格式:
OUTPORT,AX
功能:
(AX)→PORT
(3)语句格式:
OUTDX,AL
功能:
(AL)→[DX]
(4)语句格式:
OUTDX,AX
功能:
(AX)→[DX]
3.查表转换指令XLAT
语句格式:
XLATOPS或XLAT
功能:
将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。
即([BX+AL])→AL。
例:
LEABX,TABLE
MOVAL,4
XLATTABLE
3.4.2算术运算类指令
1加法指令
2减运算指令
3乘运算指令
4除运算指令
1加法指令
加指令ADD
带进位加指令ADC
加1指令INC
1.加指令ADD
语句格式:
ADDOPD,OPS
功能:
将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。
即(OPD)+(OPS)→OPD。
ADDReg,RegADDAX,SI
ADDReg,MemADDDX,DATA[BX]
ADDMem,RegADDDATA[DI],AX
ADDMem,ImADDCOUNT[SI],100
ADDReg,ImADDBX,200
演示
3.带进位加指令ADC
语句格式:
ADCOPD,OPS
功能:
将目的操作数加源操作数再加低位进位,结果送目的地址。
即(OPD)+(OPS)+CF→OPD。
【例】无符号双字加法运算。
N1=420030AB,N2=90B0D400
计算N1+N2,和送入NUM
MOVAX,30ABH;
ADDAX,D400H;
MOVNUM,AX
MOVAX,4200H
ADCAX,90B0H;
MOV[NUM+2],AX
演示
1.加1指令INC
语句格式:
INCOPD
功能:
将目的操作数加1,结果送目的地址。
即(OPD)+1→OPD。
INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。
如:
INCBX,即(BX)+1→BX。
加1指令可用于对计数器和地址指针进行调整。
2减运算指令
减指令SUB
带借位减指令SBB
减1指令DEC
求补指令NEG
比较指令CMP
1.减指令SUB(subtract)
语句格式:
SUBOPD,OPS
功能:
目的操作数减源操作数,结果存于目的地址,源地址内容不变。
即(OPD)-(OPS)→OPD
【例】减法运算。
MOVAX,5678H;(AX)=5678H
SUBAX,1234H;(AX)=4444H
MOVBX,3354H;(BX)=3354H
SUBBX,3340H;(BX)=0014H
2.带借位减指令SBB(subtractwithborrow)
语句格式:
SBBOPD,OPS
功能:
目的操作数减源操作数再减低位借位CF,结果送目的地址。
用于多字节减法
即(OPD)―(OPS)―CF→OPD
例已知有二个32位数分别放在变量FIRST和SECOND中,求两者之差并放在FIRST中。
MOVAX,wordptr;取低字
SUBAX,wordptr[SECOND];低字相减
MOVwordptr[FIRST],AX;保存低字取高字,
MOVAX,wordptr[FIRST+2];取被减数高16位
SBBAX,wordptr[SECOND+2];高字相减。
在低字相减时,有可能会产生“借位”
MOVwordptr[FIRST+2],AX;
3.减1指令DEC
语句格式:
DECOPD
功能:
将目的操作数减1,结果送目的地址。
即(OPD)-1→OPD。
DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。
如:
DECCX。
即(CX)-1→CX。
减1指令DEC也一般用于对计数器和地址指针的调整。
4.求补指令NEG
语句格式:
NEGOPD
功能:
将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。
即(OPD)+1→OPD。
【例】求补运算。
MOVAX,0FF64H
NEGAL;(AX)=0FF9CH
SUBAL,9DH;(AX)=0FFFFH
NEGAX;(AX)=0001H
DECAL;(AX)=0000H
NEGAX;(AX)=0000H
5.比较指令CMP
语句格式:
CMPOPD,OPS
功能:
目的操作数减源操作数,结果只影响标志位,不送入目的地址。
即(OPD)-(OPS)。
【例】比较AL的内容数值大小。
CMPAL,50;(AL)-50
JBBELOW;(AL)<50,转到BELOW处执行
SUBAL,50;(AL)>=50,(AL)-50→AL
INCAH;(AH)+1→AH
BELOW:
…
3乘运算指令
1.无符号数乘法指令MUL
2.有符号乘指令IMUL(SignedIntegerMultiply)
1.无符号数乘法指令MUL
语句格式:
MULOPS
功能:
若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。
即字节乘法:
(AL)*(OPS)→AX,
字乘法:
(AX)*(OPS)→DX,AX
【例】无符号数0A3H与11H相乘。
MOVAL,0A3H;(AL)=0A3H
MOVBL,11H;(BL)=11H
MULBL;(AX)=0AD3H
设在字变量A1,A2中分别存有两个16位无符号二进制数,现在要求它们的积,并将积存入以BUFFER为偏移地址的连续存区中
MOVAX,AL
MULA2
MOVBUFFER,AX
MOVBUFFER+2,DX
2.有符号乘指令IMUL
语句格式:
IMULOPS
功能:
字节乘法:
(AL)*(OPS)→AX,字乘法:
(AX)*(OPS)→DX、AX。
IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。
【例】有符号数0B4H与11H相乘。
MOVAL,0B4H;(AL)=B4H
MOVBL,11H;(BL)=11H
IMULBL;(AX)=0FAF4H
4除运算指令
1.无符号除指令DIV
2.有符号除指令IDIV
1.无符号除指令DIV
语句格式:
DIVOPS
功能:
字节除法:
(AX)/(OPS)→AL(商)、AH(余数)
字除法:
(DX、AX)/(OPS)→AX(商)、DX(余数)
【例】写出实现无符号数0400H/0B4H运算的程序段。
MOVAX,0400H;(AX)=0400H
MOVBL,0B4H;(BL)=0B4H
DIVBL;商(AL)=05H,余数(AH)=7CH
2.有符号除指令IDIV
语句格式:
IDIVOPS
功能:
字节除法:
(AX)/(OPS)→AL(商)、AH(余数)
字除法:
(DX,AX)/(OPS)→AX(商)、DX(余数)
除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出。
【例】写出实现有符号数0400H/0B4H运算的程序段。
MOVAX,0400H;(AX)=0400H
MOVBX,0B4H;(BX)=0B4H
IDIVBX;(AL)=0F3H,(AH)=24H
3符号扩展指令
1.字节转换成字指令CBW(ConvertBytetoWord)
2.将字转换成双字指令CWD
1.字节转换成字指令CBW
语句格式:
CBW
功能:
将AL中的符号位数据扩展至AH。
【例】将字节数据扩展成字数据。
MOVAL,0A5H;(AL)=0A5H
CBW;(AX)=0FFA5H
CBWAL,;(AL)=25H
;(AX)=0025H
2.将字转换成双字指令CWD
语句格式:
CWD
功能:
将AX中的符号位数据扩展至DX。
【例】将字数据扩展成双字数据。
MOVDX,0;(DX)=0
MOVAX,0FFABH;(AX)=0FFABH
CWD;(DX)=0FFFFH(AX)=0FFABH
设在字变量B1,B2中分别存有两个16位带符号二进制数,计算A1/A2,并将其商和余数分别以RESULT为偏移地址的连续存区中。
下面是完成此过程的程序段:
MOVAX,B1
CWD
IDIVB2
MOVRESUL