汇编Word格式文档下载.docx
- 文档编号:18636817
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:43
- 大小:37.67KB
汇编Word格式文档下载.docx
《汇编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编Word格式文档下载.docx(43页珍藏版)》请在冰豆网上搜索。
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]
,(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
,(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
PUSHOPS
将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。
即:
①(SP)-1→SP(OPS)15~8→[SP]
②(SP)-1→SP(OPS)7~0→[SP]
例:
PUSHSI
PUSHCS
PUSH[1000H]
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
LAHF
将标志寄存器的低8位送入AH寄存器。
即(FLAGS)7-0→AH。
该指令的执行对标志位无影响。
【例】标志寄存器传送。
执行前:
(FLAGS)=0485H,(AX)=0FFFFH
SAHF
将AH的内容送入标志寄存器的低8位,高8位不变。
即(AH)→FLAGS7-0.。
从该指令功能可看出,SAHF为LAHF的逆过程。
PUSHF
将标志寄存器的内容压入堆栈。
即(FLAGS)→↓(SP)。
将栈顶内容弹出送入标志寄存器中。
即↑(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
输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:
OUTPORT,AL
(AL)→PORT
OUTPORT,AX
(AX)→PORT
OUTDX,AL
(AL)→[DX]
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除运算指令
加指令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指令可用于对计数器和地址指针进行调整。
减指令SUB
带借位减指令SBB
减1指令DEC
求补指令NEG
比较指令CMP
1.减指令SUB(subtract)
SUBOPD,OPS
目的操作数减源操作数,结果存于目的地址,源地址内容不变。
即(OPD)-(OPS)→OPD
【例】减法运算。
MOVAX,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,结果送目的地址。
【例】求补运算。
MOVAX,0FF64H
NEGAL;
(AX)=0FF9CH
SUBAL,9DH;
(AX)=0FFFFH
NEGAX;
(AX)=0001H
DECAL;
(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:
…
1.无符号数乘法指令MUL
2.有符号乘指令IMUL(SignedIntegerMultiply)
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;
IMULBL;
(AX)=0FAF4H
1.无符号除指令DIV
2.有符号除指令IDIV
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
IDIVOPS
(AX)/(OPS)→AL(商)、AH(余数)
(DX,AX)/(OPS)→AX(商)、DX(余数)
除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出。
【例】写出实现有符号数0400H/0B4H运算的程序段。
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
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编
![提示](https://static.bdocx.com/images/bang_tan.gif)