【文档说明】第四章汇编语言程序格式课件.ppt,共(63)页,247.667 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44765.html
以下为本文档部分文字说明:
第四章汇编语言程序格式汇编程序编辑程序连接程序PROG.ASMPROG.OBJPROG.EXE4.1汇编程序功能目前常用的汇编程序Microsoft:MASMBorland:TASM注:教材中的例题及说明
均已MASM5.0版本为准汇编程序的主要功能:(1)、检查源程序(2)、测出源程序的语法错误,并给出出错信息(3)、产生源程序的目标文件,并给出列表文件(4)、展开宏指令••4.2伪操作伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、定
义程序模式、数据定义、分配存储区、指示程序开始结束等功能。汇编语言程序的语句:一、指令二、伪操作三、宏指令dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段ASSUMECS:code,DS:datastart:
MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDSENDstart••4.2.1处理器选择伪操作功能:告诉汇编语言应该选择那一种指令主要有:.8086选择8086指令系统.286选择80286指令系
统.286P选择保护方式下的80286指令系统.386选择80386指令系统.836P选择保护方式下的80386指令系统.486选择80486指令系统.486P选择保护方式下的80486指令系统.586选择Pentium指令系统.586P选择保护方式下的Pentium指
令系统注:汇编程序的默认值是.8086••4.2.2段定义伪操作1、完整的段定义伪操作格式:段名SEGMENT[定位类型,组合类型,使用类型,类别]……段名ENDS▲段定义由伪操作SEGMENT开始、ENDS结束。
其中:SEGMENT和ENDS必须成对出现,且语句前必须有段名,段名必须相同。▲SEGMENT和ENDS语句之间可以有指令和其他伪操作,表示存放在该段内存的变量、指令或其他伪操作对该段内存的处理▲程序中可以定义多个段。▲程序经汇编、连接及装入内存后,
段名为一具体的段值。••例:定义用户堆栈stack_segsegmentdw40Hdup(?)toslabelwordstack_segendscode_segsegment……movax,stack_segmovss,a
xmovsp,offsettos……code_segendsSTACK40H(SP)(SS)••ASSUME伪操作格式ASSUME段寄存器:段名[,段寄存器:段名,…]其中:段寄存器为CS、DS、ES、SS中的一个段名为用伪操作SEGMENT定义过的段名例ASSU
MECS:cc,DS:aa▲ASSUME伪操作的作用明确段和段寄存器的关系,指示汇编程序指令中用到的标号、过程及变量所在的段。其中对标号、过程必须用CS段寄存器指示对变量可用CS、DS、ES、SS段寄存器指示••▲若未用ASSUME语句指示指令中用到的标号、过程和变量所在的段,汇编程序将给出
错误信息。▲ASSUME语句只起指示作用,并无实际的操作。在程序中引用定义的变量做内存操作数时,需按寻址方式用传送指令(如MOV)给相应的段寄存器赋值。••data_seg1segment…data_seg1ends;定义数据段data_seg2segment…data_seg2e
nds;定义附加段code_segsegmentassumecs:code_seg,ds:data_seg1,es:data_seg2start:movax,data_seg1movds,axmovax,data_se
g2moves,ax;段地址段寄存器…code_segendsendstart例:第1第3第2••类型及属性的说明定位类型:说明段的起始地址应有怎样的边界值PARA:指定段的地址从小段边界开始.--
----------------------------默认值BYTE:该段可从任何字节开始.WORD:该段必须从字边界开始.DWORD:该段必须从双字边界开始.PAGE:该段必须从页的边界开始.组合类型:说明程序连接时段的合并方法PRIVATE:该段为私有
段,连接时不与其他同名的分段合并---默认值PUBLIC:该段连接时与其他同名的分段连在一起COMMON:该段在连接时与其它同名的段具有相同的起始地址.AT:使段的起始地址为后面表达式的16位值.STACK:指
定该段为堆栈的一部分(放于低地址).MEMORY:同PUBLIC使用类型:说明是16位寻址方式还是32位寻址方式USE16:16位寻址方式------------------------------------------------
----默认值USE32:32位寻址方式类别:给出连接时组成段组的类别名••2、存储模型与简化段定义伪操作(MASM5.0以上版本)简化段定义的特点:虽然没有SEGMENT那样的较完整的表达能力,但简单易用。(1)存储模型功能:说明在存储器中是如何安排各个段的,同时也是使用
简化段定义的前提条件。格式:.MODEL模型定义,[模型选项]••存储模型(7种)①Tiny所有的代码和数据都放在一个段内,其代码和数据都是近访问。用于.COM文件②Small所有的数据都放在一个64KB数据段,所有的代码都放在一个64KB代码段,其代码和数据都是近访问。最常用③
Medium代码使用多个段,数据在一个64KB数据段,数据是近访问,代码是远访问。④Compact数据使用多个段,代码在一个64KB代码段,代码是近访问,数据是远访问。⑤Large代码和数据使用多个段,其代码和数据都是
远访问⑥Huge与Large模型相似,但允许数据段超过64KB⑦Flat允许用32位偏移量,DOS下不能用,只能在OS/2下或其他保护模式的操作系统下使用。••模型选项:1、高级语言接口:指汇编语言程序作为某一种高级语言程序的过程而为该高级语言所调用,如,C,PASCAL,FORTRA
N,BASIC等2、操作系统:说明程序运行于那个操作系统之下,可用OS_DOS或OS_OS2说明,默认是OS_DOS3、堆栈距离:用NEARSTACK或FARSTACK说明。其中NEARSTACK指把堆栈段和数据段合并到一个DGROUP段中,DS和SS均指向DGROUP段。FARSTA
CK是指堆栈段和数据段并不合并。当存储模型为TINY,SMALL,MEDIUM和FALT时,默认项为NEARSTACK,当存储模型为COMPACT,LARGE和HUGE时默认项为FARSTACK••(2)简化段定义(1)、给高级语言编写汇编语
言过程,为便于与高级语言兼容,需要把数据段分得很细,可以采用:.CODE[段名]对于一个代码段的模型,段名为可选项;对于多个代码段的模型,则应为每个代码段指定段名.DATA.DATA?.FARDATA[段名]默认段
名为FAR_DATA.FARDATA?[段名]默认段名为FAR_BSS.CONST.STACK[大小]默认值是1KB••(2)、编写一个独立的汇编语言程序,不需如(1)那样细分,一般采用:.CODE[段名]对于一个代码段的模型,段名为可选项;对于多个代码段的模型,则应
为每个代码段指定段名.DATA.STACK[大小]默认值是1KB••(3)与简化段定义有关的预定义符号在简化段定义情况下,也需要把段名装入段寄存器,可用:MOVAX,@DATAMOVDS,AX其中@DATA给出了数据段的段名••(4)用MODEL定义存储器模型时的段默认
属性见教材的123-124页表4.1注意:1.TINY模型下没有堆栈段定义伪操作,其他6种都有2.TINY模型下DATA,DATA?,CONST,CODE组成DGROUP;其他模型下DATA,DATA?,CONST,STACK组成DGROUP3.凡未
初始化的数据段给出的段扩展名为BSS••(5)简化段定义举例例4.2.MODELSMALL;定义存储模型.STACK100H;定义堆栈段.DATA;定义数据段………….;数据定义伪操作.CODE;定义代码段STAR
T:;程序开始执行地址MOVAX,@DATAMOVDS,AX………….MOVAX,4C00HINT21HENDSTART;程序结束;数据段段地址送DS寄存器;返回DOS••例4.3.MODELSMALL;
定义存储模型.STACK100H;定义堆栈段.CONST;定义常数段………….;数据定义伪操作.DATA;定义数据段………….;数据定义伪操作.CODE;定义代码段START:;程序开始执行地址MOVAX,DGROUPMOVD
S,AX………….MOVAX,4C00HINT21HENDSTART;程序结束;段组名作为段地址装入DS寄存器;返回DOS••例4.4.MODELSMALL;定义存储模型.FARDATA;定义远初始化数据段………….;数据定义伪操作.DATA
;定义数据段………….;数据定义伪操作.CODE;定义代码段START:;程序开始执行地址MOVAX,@DATAMOVDS,AXMOVAX,@FARDATAMOVES,AXASSUMEES:@FARDATA………….MOVAX,4C00H
INT21HENDSTART;程序结束;数据段段地址送DS寄存器;远初始化数据段段地址送ES寄存器;返回DOS••3、段组定义伪操作系统默认:在各种存储模型下,汇编程序自动的组成一个段组DGROUP,见表4.
1段组中的各个段具有相同的段地址,即程序在访问段组中的各段时使用同一个段寄存器。段组的使用有俩种情况:用户定制:用户可根据需要自行制定段组格式:段组名GROUP段名[,段名…]程序中对定义在不同段中的变量都可以使用同一
个段寄存器进行访问••例4.5DSEG1SEGMENTWORDPUBLIC‘DATA’……DSEG1ENDSDSEG2SEGMENTWORDPUBLIC‘DATA’……DSEG2ENDSDATAGROUPGROUPDSEG1,DSEG2CSEGSEGMENTPARAPUBL
IC‘CODE’ASSUMECS:CSEG,DS:DATAGROUPSTART:MOVAX,DATAGROUPMOVDS,AX…….MOVAX,4C00HINT21HCSEGENDSENDSTART••4.2.3程序
开始和结束伪操作1.NAME和TITLE伪操作格式:NAME模块名格式:TITLEtext(前6个字符/60个字符)在源程序开始可用NAME或TITLE为模块命名,模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义
,此时源文件名作为模块名。模块命名的规则:NAMETITLE源文件名••2.END伪操作格式END[标号]多个程序模块相连,则只有主程序要使用标号,其他子程序则只用END而不用指定标号作用是指示源程序到此结束。汇编程序
对END之后的语句不进行处理。程序中所有有效语句应放在END语句之前。源程序中必须有END结束语句。汇编程序对无END语句的源程序不进行处理,只给出无END语句错误信息。启动地址••4.2.4数据定义及存储器分配伪操作格式变量名类型助记符操作数[,操作数,...]▲用来定义程序中所
用的内存操作数。其中变量名指示内存操作数的地址(符号地址),其值是该伪操作中第一个数据项的第一个字节的偏移地址,另外,还有个类型属性表示该语句中每一个数据项的长度(以字节为单位),如DB为1,DT为10。类型助记符指示内存操作数的类型(字节、字、双字等)操作数指示内存操作数
的内容▲汇编程序将定义的操作数,按其类型分配内存单元数,顺序存入变量名指向的内存单元中。••▲常用的类型助记符有:DB(BYTE)指示其后的操作数为字节类型DW(WORD)指示其后的操作数为字类型DD(DWORD)指示其后的操作数为双字类型D
F(FWORD)指示其后的操作数为六字节类型,386+DQ(QWORD)指示其后的操作数为四字类型DT(TBYTE)指示其后的操作数为10字节类型注:括号内为MASM6中的定义初始化数据段:由伪操作把数据存入
指定的存储单元未初始化数据段:只分配存储单元而并不存入数据地址存入:DW:变量或标号的偏移地址(16位)DD:变量或标号的偏移地址(16位)与段地址(16位)DF:变量或标号的偏移地址(32位)与段地址(16位)••例1:定义赋初值的变
量dataSEGMENTxxDB1,-1,0fcHyyDW1,-1,0fcHzzDD1,-1,0fcHdataENDSxxyyzz01FFFC0100FFFFFC0001000000FFFFFFFFFC0
000001-1FC1-1FC1-1FC••例2:定义字符串变量(只能用DB定义)dataSEGMENTstr1DB'TsingHua'str2DB'INPUT:',0dH,0aH,'$'dataENDS注意:3个及其以上的字符,只能用DB定义str1DW‘abcd’str2DD‘abcd
’str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’••▲操作数可
以是用常量、表达式和?表示。常量和表达式表示内存操作数的初始值,其值应在其定义的类型范围内,否则汇编出错。例aaDB270bbDW80000用?表示不置初始值的内存操作数。例ccDB?可用DUP复制操作符定义相同的操作数,其格
式为:重复次数DUP(操作数)例eeDB3DUP(4)等价于eeDB4,4,4••▲操作数的类型属性的定义指令中的操作数的类型属性应该一致1、数据伪操作中的定义,如DB为1,DT为102、PTR属性操作符格式:typePTR变量
±常数表达式type可以是:BYTE,WORD,DWORD,FWORD,QWORD,TBYTE如:MOVAX,WORDPTROPER1+1MOVAX,DWORDPTROPER1+1可见:同一个变量可以具有不同的类型
属性••3、LABEL伪操作格式:nameLABELtypetype可以是:BYTE,WORD,DWORD,FWORD,QWORD,TBYTENEAR,FAR如:BYTE_ARRAYLABELWORDBYTE_ARRAYLAB
ELDWORD可见:同一个地址可以赋予不同类型的变量名••4.2.5表达式赋值伪操作EQU(不占存储单元)格式:表达式名EQU表达式优点:提高程序的可读性,也使其便于修改CONSTANTEQU256ALPHAEQU7BETAEQUALPHA-2“=”伪操作(允许重复定
义)格式:变量=表达式…EMP=7…EMP=EMP+1…••4.2.6地址计数器与对准伪操作1、$地址计数器:保存当前正在汇编的指令的偏移地址,每处理一条指令,其值就加1个值(该指令的字节数)$用在指令中,表示本条指令的第一个字节的地址例:JNE$+6;转向地址是JNE的首址+6$用在伪操作中,
表示的是地址计数器的当前值例:$用在伪操作的参数字段——表示地址计数器的当前值ARRAYDW1,2,$+4,3,4,$+4010074000200ARRAY7C0078000300040082007E00••2、ORG伪操作功能:设置当前地址计数器的值格式:ORG常数表达式
常数表达式:(1)常数(2)符号地址开始的位移量(3)从当前地址计数器值$开始的位移量(4)如:(5)ORG10(6)ORG$+8••3.EVEN伪操作功能:使下一个变量或指令开始于偶数字节地址格式:EVE
N4.ALIGN伪操作功能:使下一个变量或指令开始于2的幂字节地址格式:ALIGN边界(2的幂)••4.2.7基数控制伪操作功能:规定无标记数的基数格式:.RADIX表达式(2,8,10,16)例:.RADIX16MOVBX,0FFMOVBX,178D注:汇编程序默认的数是十进
制数••4.3汇编语言程序格式[名字][:]助记符[操作数,][;注释]名字项助记符项操作数项注释项汇编语言源程序的语句组成:dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段ASSUMECS:code,DS:data
start:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDSENDstart例:••4.3汇编语言程序格式[符号地址]操作操作数[;注释]变量指令寄存器说明程序或语句标号伪
指令标号的功能宏指令变量常数表达式表达式:数字表达式地址表达式••[名字][:]助记符[操作数,][;注释]名字项助记符项操作数项注释项1.名字项据语句功能的不同,名字项可用来表示:段名、变量名、标号
、过程名以及常量名等。dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH
,4CHINT21H;返回DOScodeENDSENDstart••名字项用一个符号表示。对符号的规定:①由字母A~Z,a~z,数字0~9及符号@、$、_、?、.等组成。最长31个字符,超出部分忽略。②不能用数字打头,以免与十六进制数相混。③不使用汇编程序中的
保留字。(如指令的助记符等)④对定义的符号不区分大小写。[名字][:]助记符[操作数,][;注释]名字项助记符项操作数项注释项••[名字][:]助记符[操作数,][;注释]名字项助记符项操作数项注释项2.助记符项助记符可以是指令、伪操作中的助记符。对于指令,汇编程序将其翻译成机器语言指令。MOVA
X,100→B80001对于伪操作,汇编程序据其要求的功能进行处理。dataSEGMENT→data与一段值对应stringDB‘Tsinghua’→string与一内存地址对应••3.操作数项操作数给出参与操作的数或数所在的地方。操作数多于一个时
,用逗号分开。操作数可以是常数、寄存器、存储器操作数、标号名、过程名或表达式等。[名字][:]助记符[操作数,][;注释]名字项助记符项操作数项注释项••常数给出具体的数据。可以是数字常量或字符常量。◢◢数字默
认十进制,也可加D表示十进制数。如1234D,1234◢◢数字后加B表示二进制数。如1010B◢◢数字后加H表示十六进制数。如1234H◢◢字符常量,用单引号表示。如‘1234’汇编时,用字符对应的ASCII表示。如31H,32H,3
3H,34H例data1DB12,34,56;十进制data2DB12H,34H,56H;十六进制MOVAL,‘G’;字符stringDB‘1234’;字符串••A、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。如寄存器名AH、BH、CH
、DH变量名abcdH等例movAL,0AHmovAL,AHmovBX,0abcdH••表达式由常量、标号、变量和一些操作符构成。汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到
指令中。据表达式所表示的内容分:数字表达式、地址表达式。表达式是指令或伪操作的操作数;表达式中的操作符由汇编程序完成。例MOVAX,12-4;MOVAX,8;数字表达式LEABX,[string+4];地址表达式••
表达式中的操作符:1.算术操作符2.逻辑与移位操作符3.关系操作符真:0FFFFH;假:04.数值回送操作符5.属性操作符(+、-、*、/、MOD)(AND、OR、NOT、XOR、SHL、SHR)(EQ、NE、GT、GE、LT、LE)(TYPE、LENGTH、SIZE、SEG、
OFFSET)(PTR、段操作符、SHORT、THIS、HIGH、LOW、HIGHWORD、LOWWORD)••表达式操作符(5类)(1)算术操作符:,,,,mod例:ADDAX,A+2;符号地址常数有意义;时意义不明确MOV
AX,BX+1;(2)逻辑操作符:AND,OR,XOR,NOT例:OPR1EQU25OPR2EQU7……ANDAX,OPR1ANDOPR2汇编ANDAX,1••(3)关系操作符:EQ,NE,LT,LE,GT,GE计算结果为逻
辑值:真0FFFFH假0000H例:MOVFID,(OFFSETY-OFFSETX)LE128X:…………Y:……若128(假)汇编结果MOVFID,-1汇编结果MOVFID,0若128(真)••(4)数值回送操作符:OFFSET/SEG变量
(或标号)功能:回送变量或标号的偏址/段址例:MOVBX,OFFSETXMOVDX,SEGXTYPE变量(或标号)变量:DBDWDDDQDT标号:NEARFAR值:124810-1-2LENGTH变量功能:回送由DUP定义的变量的单元数,其它情况回送1SIZE变量功能:LENG
TH*TYPE••例:ARRAYDW100DUP(?)TABLEDB‘ABCD’ADDSI,TYPEARRAY;ADDSI,2ADDSI,TYPETABLE;ADDSI,1MOVCX,LENGTHARRAY;MOVCX,100MOVCX,LENGTHTABLE;
MOVCX,1MOVCX,SIZEARRAY;MOVCX,200MOVCX,SIZETABLE;MOVCX,1••(5)属性操作符:类型PTR表达式例:MOVWORDPTR[BX],5段操作符例:MOVES:[BX],ALSHORT标号例:JMPSHORTNEXTTHIS类型例:TAEQUTHI
SBYTETBDW100DUP(?)NEXTEQUTHISFARMOVCX,100字节分离操作符例:CONSEQU1234HHIGHMOVAH,HIGHCONSLOWMOVAL,LOWCONS••例:1.算术运算符(+、-、*、/、MOD(
取余数))MOVAX,6*8←MOVAX,482.逻辑运算符(AND、OR、NOT、XOR)MOVAX,80hOR70h←MOVAX,0F0h3.关系运算符(EQ、NE、GT、GE、LT、LE)真:FFFFH;假:
0MOVAX,1GE2←MOVAX,0••4.数值返回操作符(SEG、OFFSET)SEG取符号地址的段地址例MOVAX,SEGyyOFFSET取符号地址的偏移地址例MOVBX,OFFSETyybbSEGMENTyyDB6dup(?)bbE
NDSccSEGMENTASSUMECS:cc,DS:aa,ES:bbstart:CLDMOVAX,SEGyyMOVES,AXMOVDI,OFFSETyyMOVCX,6…….ccENDSENDstart••aaSEGMENTxxDB'Hello!’aaENDSbbSEGMENTyy
DB6dup(?)bbENDSccSEGMENTASSUMECS:cc,DS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,xxMOVAX,SEGyyMOVES,AXMOVDI,OFFSETyyMOVCX,6REPMOVS
BMOVAH,4CHINT21HccENDSENDstartD:\>DEBUGhello1.exe-U;查看程序代码129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:000
48ED8MOVDS,AX129F:00068D360000LEASI,[0000]129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000
129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、、、、、、MOVAX
,bbLEADI,yy••注意:SEG、OFFSET只能对符号地址操作MOVAX,SEG[BX]MOVBX,OFFSET[SI]••4.注释项由分号引出,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。作用:①注释
程序,增强程序可读性。②可放在语句最前,暂时注释某语句,调试程序用。例、、、;MOVAH,2;显示提示信息;MOVDL,’A’;INT21H、、、[名字][:]助记符[操作数,][;注释]名字项助记符项操作数项注释项••4.4汇编语言程序的上机过程为了运行汇编语
言程序,在磁盘上需要有:•编辑程序,如EDIT.EXE•汇编程序,如MASM.EXE•连接程序,如LINK.EXE•调试程序,如DEBUG.COM注:必要时还需要CREF.EXE,EXE2BIN.EXE等文件••上机环境硬件系统软件应用软件操作系统:DOS
系统编辑器:EDIT.exe编程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:USER.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备••汇编语言上机过程D:>EDITABC.asmD:>MAS
MABC;有语法错,回EDIT下改该程序D:>LINKABC;有错,回在EDIT下改程序D:>ABC运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:>DEBUGABC.exe编辑源程序EDITABC.ASM汇编源程序MASMABC.ASM形成目标程序A
BC.OBJ连接目标程序LINKABC.OBJ有连接错误信息?形成可执行程序ABC.EXE装入可执行程序到内存,并执行D:\>sub>ABC下一程序用DEBUG调试可执行程序D:\>sub>DEBUGABC.EXE找到原因YNYNNYN有汇
编错误信息?Y运行结果正确?用DEBUG调试程序查错?••1、汇编语言文件2、汇编程序3、OBJ文件4、LIST文件5、CRF文件6、MAP文件?••第四章作业P156---1584,5,11,18,19••