汇编语言第3章 宏汇编语言.docx
- 文档编号:7119207
- 上传时间:2023-01-19
- 格式:DOCX
- 页数:35
- 大小:205.29KB
汇编语言第3章 宏汇编语言.docx
《汇编语言第3章 宏汇编语言.docx》由会员分享,可在线阅读,更多相关《汇编语言第3章 宏汇编语言.docx(35页珍藏版)》请在冰豆网上搜索。
汇编语言第汇编语言第3章章宏汇编语言宏汇编语言第三章宏汇编语言一:
宏汇编语言格式3.1.1指令语句格式指令语句的一般格式如下:
标号:
指令助记符操作数;注释1标号:
标号是机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:
”。
2指令助记符:
指令助记符为语句的核心成分,表示了该语句的操作类型。
3操作数:
操作数表示指令助记符的操作对象。
4注释:
注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。
3.1.2伪指令语句格式伪指令语句格式如下:
符号名伪指令符操作数;注释1符号名:
符号名是伪指令语句的一个可选项。
2伪指令符:
伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。
2操作数:
伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。
4注释:
伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。
3.2汇编语句表达式3.2.1常量1数值常量2.字符串常量字符串常量是用单引号或双引号引起来的一个或多个字符。
字符串常量是以各字符的ASC码表示的。
如A用41H表示,字符串A1B2用41H,31H,42H,32H表示。
3.2.2变量1变量
(1)段属性
(2)偏移地址属性(3)类型属性2变量的定义表达式项是给变量或指定存储单元赋予初值,它有以下几种形式:
(1)数值表达式数据定义伪指令可以为一个或连续的存储单元设置数值初值。
【例】为数据段分配存储单元。
DATASEGMENTADB11H,12H,13HBDW1122H,3344HCDD12345678HDATAENDS上述变量的存储单元分配及初始化情况如下图3.1所示。
数据段中数据存储分配图
(2)字符串表达式字符串表达式中的字符串必须用引号引起来。
DB、DW、DD伪指令将字符串中的各字符均以ASC码形式存放在相应的存储单元,但表示形式各不相同。
【例】为字符串分配存储单元。
DATASEGMENTSTR1DB1234STR2DWAB,CD,ASTR3DDABDATAENDS其存储单元分配如下图所示。
(3)地址表达式(只适用DW和DD两个伪指令)如果该地址表达式为一变量(或标号)名,用DW伪指令则是取它的偏移地址来初始化变量,用DD伪指令则是取它的段首址和偏移地址来初始化变量。
例如:
BUF1DWABUF2DDB(4)?
表达式?
表示不确定的值(5)带DUP的表达式在表达式中使用重复数据操作符DUP,可以为连续的存储单元提供重复数据,其格式为:
NDUP(表达式)其中N为重复因子,只能取正整数,表示定义了N个重复数据存储单元,其类型由它前面的数据定义伪指令确定,而每个数据存储单元中的初值由DUP后面圆括号中的表达式给定。
例如:
BUFDB100DUP(0)以上语句定义了以BUF为首址,大小为100个字节,初值为0的数据存储单元。
3.2.3标号标号是一条指令语句的符号地址。
在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。
因此,标号可作为转移类指令的操作数,即转移地址。
【例】符号地址表示。
NEXT:
MOVAL,SI;带标号NEXT的指令DECCXJNENEXT;标号NEXT作转移指令的操作数标号也具有三种属性1段属性2偏移地址属性3类型属性3.2.4表达式与运算符1算术运算符算术运算符包括:
(加)、(减)、*(乘)、(除)、MOD(求模)、SHL(左移)、SHR(右移)几种,它既可以用于数值表达式又可用于地址表达式。
【例】用算术运算符进行数值表达式运算。
NUM1EQU25*450;NUM1=50NUM2EQUNUM1/7;NUM2=7NUM3DBNUM1MOD7;NUM3=1VAR1DB1,2,3,4,5VAR2DB12345NUM4EQUVAR2-VAR1;NUM4=5NUM5EQU0FHMOVAL,NUM5SHL4;(AL)=11110000BMOVBL,NUM5SHR4;(BL)=00000000B2辑运算符逻辑运算符包括:
逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。
由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。
【例】用逻辑运算符进行运算。
MOVAL,34HAND0FH;04HALMOVBL,05HOR30H;35HBLMOVCX,NOT00FFH;0FF00HCXMOVDX,789AHXOR000FH;7895HDX3关系运算符关系运算符包括:
相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。
【例】用关系运算符进行数值表达式运算。
NUM1DB10LT5;NUM1=0NUM2DB0AAAAHGT7FFFH;NUM2=0FFFFHMOVAX,AEQ41H;0FFFFHAXMOVBX,NUM2LTNUM1;0BX4。
属性运算符PTR运算符格式:
类型PTR地址表达式PTR与EQU连用,可定义与PTR右边地址表达式类型不同的新变量名或新标号,但不另分配存储单元。
5。
数值返回运算符
(1)SEG运算符格式:
SEG变量或标号功能:
分离出其后变量或标号所在段的段首址。
例如:
MOVAX,SEGARRMOVDS,AX
(2)OFFSET运算符格式:
OFFSET变量或标号功能:
分离出其后变量或标号的偏移地址。
例如:
MOVBX,OFFSETBUF(3)TYPE运算符格式:
TYPE变量或标号功能:
分离出其后变量或标号的类型。
如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。
它们之间的关系见表3.2所示。
(4)LENGTH运算符格式:
LENGTH变量功能:
取出变量所含的数据存储单元个数。
【例】取出变量占存储单元个数。
DATASEGMENTADBABCDEFBDW10DUP(1,2DUP
(2)CDB3,20DUP(0)DATAENDSMOVAX,LENGTHA;1AXMOVBX,LENGTHB;10BXMOVCX,LENGTHC;1CX(5)SIZE运算符格式:
SIZE变量功能:
取出变量所含的数据存储区大小。
其返回值为:
LENGTH变量*TYPE变量例如:
上例中A、B、C三变量:
SIZEA=LENGTHA*TYPEA=1SIZEB=LENGTHB*TYPEB=20SIZEC=LENGTHC*TYPEC=1(6)字节分离运算符字节分离运算符包括:
HIGH和LOW。
格式:
HIGH常量或地址表达式LOW常量或地址表达式功能:
HIGH用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。
3.2.5运算符的优先级3.3伪指令3.3.1数据定义伪指令常用的数据定义伪指令有DB,DW,DD,DQ,DT。
格式:
变量名数据定义伪指令表达式,功能:
定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。
3.3.2符号定义伪指令1等价伪指令格式:
符号名EQ表达式功能:
为常量、表达式及其他各种符号定义一个等价的符号名,但它不申请存储单元。
用途:
用符号表示常量、数值表达式,即定义符号常量。
使用符号常量可使程序简单明了,增强程序的可读性和通用性。
EQU与属性运算符TR或THIS联合使用,可以给变量或标号定义新的类型属性并重新命名,但保持其段偏移地址属性不变。
利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。
2。
等号伪指令格式:
符号名=表达式功能:
为常量、表达式及其他各种符号定义一个等价的符号名,并能对所定义的符号多次重复定义,且以最后一次定义的值为准。
【例】定义等价符号名。
COST=20M=MOVLOST=LOST+10;30LOSTM=ADD;M=ADD3。
定义符号名伪指令格式:
变量名或标号LABEL类型功能:
定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。
通常与数据定义伪指令连用,其功能类似语句“变量名或标号EQUTHIS类型”。
【例】定义新类型的变量。
DDBUFLABELDWORDBUFDB200DUP(0)ALABELFARB:
LEADX,BUF3.3.3段定义伪指令SEGMENT/END1段名段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。
2定位方式
(1)PARA:
表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。
(2)WORD:
表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。
(3)BYTE:
表示本段起始地址可以从任一地址处开始存放。
(4)PAGE:
表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。
3类别【例】对连接程序进行连接后存储区各段相对位置分布。
DATA1SEGMENTDATACODESEGMENTCODESTACK1SEGMENTSTACKDATA2SEGMENTDATASTACK2SEGMENTSTACK经连接程序连接后,各段的相对位置如下:
DATA1SEGMENTDATADATA2SEGMENTDATASTACK1SEGMENTSTACKSTACK2SEGMENTSTACKCODESEGMENTCODE4。
组合方式组合方式有六种类型可供选择。
(1)“不选择”2)PUBLIC(3)STACK(4)COMMON(5)MEMORY(6)AT表达式【例】有两个模块,各模块段定义如下模块1:
DATA1SEGMENTPARAPUBLICDATA1M1DB45HDUP(0)DATA1ENDSDATA2SEGMENTPARACOMMONDATA2N1DB102HDUP(0)DATA2ENDSEND模块2:
DATA1SEGMENTPARAPUBLICDATA1M2DB104HDUP(11H)DATA1ENDSDATA2SEGMENTPARACOMMONDATA2N2DB105HDUP(0)DATA2ENDSDATA3SEGMENTT1DB50DUP(20H)DATA3ENDSEND该段的定位组合方式示意图如图3.3所示。
图3.3模块1、模块2连接后段的定位组合方式示意图3.3.4假定伪指令ASSUME格式:
ASSUME段寄存器:
段名,段寄存器:
段名功能:
建立段寄存器与段之间的对应关系。
该伪指令一般出现在代码段中。
【例】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。
DATA1SEGMENTADB1,2,3DATA1ENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSDATA2SGEMENTBDB123ABCDATA2ENDSDATA3SEGMENTCDB?
,?
,?
DATA3ENDSCODESEGMENTASSUMEDS:
DATA1,ES:
DATA2,CS:
CODE,SS:
STACKSTART:
MOVAX,DATA1MOVDS,AX;DATA1DSMOVAX,DATA3MOVES,AX;DATA3ESQ1:
MOVAL,AQ2:
MOVC,ALASSUMEDS:
DATA2;建立DS与B段的对应关系MOVAX,DATA2MOVDS,AXMOVAL,BMOVC,ALCODEENDSENDSTART3.3.5置汇编地址计数器伪指令ORG格式:
ORG数值表达式功能:
将数值表达式的值赋给汇编地址计数器。
数值表达式的值须为065535之间的非负整数。
【例】给汇编地址计数器赋值。
DATASEGMENTORG10;置值为10VAR1DW100H,200HORG+5;置的值为14+5,即为19VAR2DB1,2,+1,+2NEQU-VAR2;()=23DATAENDS3.3.6源程序结束伪指令格式:
END表达式功能:
该语句标志整个程序的结束,是源程序的最后一条语句。
3.4DOS系统功能调用3.4.1概述对8086系列机来说,MS-DOS操作系统是最主要的操作系统。
MS-DOS操作系统除了具有较为完整的文件管理功能之外,同时还为各种应用程序、外围设备等提供软件接口。
它由三部分组成:
IO.SYS、MSDOS.SYS以及COMMAND.COM。
DOS系统功能调用的方法一般可分为以下几步:
设置所要调用功能的入口参数。
在AH寄存器中存入所要调用功能的功能号。
INT21H指令自动转入中断子程序入口。
相应中断子程序运行完毕,可按规定取得出口参数。
3.4.2常用的DOS系统功能调用1单字符输入(1号调用)格式:
MOVAH,1INT21H功能:
从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。
2单字符显示(2号调用)格式:
MOVDL,待显示字符的ASCII码MOVAH,2INT21H功能:
将DL寄存器中的字符送显示器显示,如果DL中为CTRL+BREAK的ASCII码,则退出。
3打印输出(5号调用)格式:
MOVDL,待打印字符的ASCII码MOVAH,5INT21H功能:
将DL寄存器中的字符送打印机打印。
4结束调用(4CH号调用)格式:
MOVAH,4CHINT21H功能:
终止当前程序并返回调用程序。
5显示字符串(9号调用)格式:
LEADX,待显示字符串首偏移地址MOVAH,9INT21H功能:
将当前数据区中以结尾的字符串送显示器显示。
6字符串输入(10号调用)格式:
LEADX,缓冲区首偏移地址MOVAH,10INT21H功能:
从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。
【例】若要在屏幕上显示字符串“Exampleofstringdisplay!
”,则程序如下:
DATASEGMENTSTRDB0DH,0AH,Exampleofstringdisplay!
DATAENDSSTACKSEGMENTSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACKBEGIN:
MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDBEGIN3.5综合举例【例】已知一数据段中的数据为:
DATASEGMENTADWMBUFDBAB,0DH,0AHCEQU500HBDW0FFAAHDDDBUFMDB2DUP
(1),2DUP(2,B)DATAENDSDATAENDS请画出该数据段数据存储的形式。
【例】阅读下列程序,指出此程序所完成的功能以及在显示器上显示的内容。
DATASEGMENTNUMDB01000101BBUFDB0DH,0AH,(NUM)=STRDB4DUP(?
)DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:
DATA,SS:
STACK,CS:
CODESTART:
MOVAX,DATAMOVDS,AXLEADI,STRMOVAL,NUMMOVCL,4SHRAL,CLORAL,30HMOVDI,ALINCDIMOVAL,NUMANDAL,0FHORAL,30HMOVDI,ALINCDIMOVBYTEPTRDI,HINCDIMOVBYTEPTRDI,LEADX,BUFMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDSTART【例】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。
DATASEGMENTINFO1DB0DH,0AH,INPUTSTRING:
INFO2DB0DH,0AH,OUTPUTSTRING:
BUFADB81DB?
DB80DUP(0)BUFBDB81DUP(0)DATAENDSSTACKSEGMENTDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:
DATA,SS:
STACK,CS:
CODESTART:
MOVAX,DATAMOVDS,AXLEADX,INFO1MOVAH,9;9号调用,显示输入提示信息INT21HLEADX,BUFAMOVAH,10;10号调用,键盘输入字符串到缓冲区BUFAINT21HLEASI,BUFA+1MOVCH,0;取字符长度CXMOVCL,SIADDSI,CX;SI指向字符串尾部LEADI,BUFB;DI指向字符串变量BUFBNEXT:
MOVAL,SIMOVDI,ALDECSIINCDILOOPNEXTMOVBYTEPTRDI,LEADX,INFO2MOVAH,9;9号调用,显示输出提示信息INT21HLEADX,BUFBMOVAH,9;反向显示字符串INT21HMOVAH,4CHINT21HCODEENDSENDSTART二:
数据传送类指令2.2.1通用数据传送指令1传送指令MOV语句格式:
MOVOPD,OPS功能:
将源操作数传送入目的地址,源地址内容不变。
即(OPS)OPD。
下图2.1描述了MOV指令在传送数据时允许传送的路径及类型。
图2.1MOV指令所允许的数据传送路径及类型【例】存储器与寄存器间数据传送。
MOVAX,BUF;BUF是变量,源操作数为直接寻址MOVBH,DI;源操作数为寄存器间接寻址MOVDI,ES:
3SI;源操作数为变址寻址,使用跨段前缀MOVBP,3BX+SI;源操作数为基址加变址寻址MOVBUFA,DL;BUFA是一字节变量MOVBP,AX;使用SS段寄存器MOVDS:
BP,DL;使用跨段前缀MOVBUF,DS;BUF是个字变量MOVES,BUF2数据交换指令XCHG语句格式:
XCHGOPD,OPS功能:
将源地址与目的地址中的内容互换。
即(OPD)OPS,(OPS)OPD。
【例】寄存器与存储器之间数据交换。
MOVAX,5678H;(AX)=5678HMOVBX,0FFFFH;(BX)=0FFFFHXCHGAX,BX;(AX)=0FFFFH,(BX)=5678H3查表转换指令XLAT语句格式:
XLATOPS或XLAT功能:
将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。
即(BX+AL)AL。
2.2.2堆栈操作指令2.2.4地址传送指令1传送偏移地址指令LEA语句格式:
LEAOPD,OPS功能:
主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。
【例】主存偏移地址的获取。
MOVBX,0100H;(BX)=0100HMOVSI,0210H;(SI)=0210HLEABX,1234BX+SI;(BX)=1544H2传送偏移地址及数据段首址指令LDS语句格式:
LDSOPD,OPS功能:
将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器3传送偏移地址及附加数据段指令LES语句格式:
LESOPD,OPS功能:
将主存某字单元内容送指定寄存器。
即(OPS)OPD,(OPS+2)ES。
2.2.5输入输出指令1输入指令IN输入指令用来从指定的外设寄存器取信息送入累加器。
它有四种形式:
(1)语句格式:
INAL,PORT功能:
(PORT)AL
(2)语句格式:
INAX,PORT功能:
(PORT)AX(3)语句格式:
INAL,DX功能:
(DX)AL(4)语句格式:
INAX,DX功能:
(DX)AL2输出指令OUT输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:
(1)语句格式:
OUTPORT,AL功能:
(AL)PORT
(2)语句格式:
OUTPORT,AX功能:
(AX)PORT(3)语句格式:
OUTDX,AL功能:
(AL)DX(4)语句格式:
OUTDX,AX功能:
(AX)DX2.3算术运算类指令2.3.1加法指令1加1指令INC语句格式:
INCOPD功能:
将目的操作数加1,结果送目的地址。
即(OPD)+1OPD。
INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。
如:
INCBX,即(BX)+1BX。
加1指令可用于对计数器和地址指针进行调整2加指令ADD语句格式:
ADDOPD,OPS功能:
将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。
即(OPD)+(OPS)OPD。
3带进位加指令ADC语句格式:
ADCOPD,OPS功能:
将目的操作数加源操作数再加低位进位,结果送目的地址。
即(OPD)+(OPS)+CFOPD。
【例】无符号双字加法运算。
MOVAX,4652H;(AX)=4652HADDAX,0F0F0H;(AX)=3742H,CF=1MOVDX,0234H;(DX)=0234HADCDX,0F0F0H;(DX)=0F325H,CF=02.3.2减运算指令1减1指令DEC语句格式:
DECOPD功能:
将目的操作数减1,结果送目的地址。
即(OPD)1OPD。
DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。
如:
DECCX。
即(CX)1CX。
减1指令DEC也一般用于对计数器和地址指针的调整。
2减指令SUB语句格式:
SUBOPD,OPS功能:
目的操作数减源操作数,结果存于目的地址,源地址内容不变。
即(OPD)(OPS)OPD【例】减法运算。
MOVAX,5678H;(AX)=5678HSUBAX,1234H;(AX)=4444HMOVBX,3354H;(BX)=3354HSUBBX,3340H;(BX)=0014H3求补指令NEG语句格式:
NEGOPD功能:
将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。
即(OPD)+1OPD。
【例】求补运算。
MOVAX,0FF64HNEGAL;(AX)=0FF9CHSUBAL,9DH;(AX)=0FFFFHNEGAX;(AX)=0001HDECAL;(AX)=0000HNEGAX;(AX)=0000H4带借位减指令SBB语句格式:
SBBOPD,OPS功能:
目的操作数减源操作数再减低位借位CF,结果送目的地址。
即(OPD)(OP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言第3章 宏汇编语言 汇编语言
![提示](https://static.bdocx.com/images/bang_tan.gif)