1、第四章 汇编语言程序结构,4.1汇编语言语句格式4.2 伪指令4.3汇编语言源程序结构4.4汇编语言的上机过程,4.1汇编语言的语句格式,一、语句种类,汇编语言程序由有序的汇编语言语句组成。,汇编语句,指令语句伪指令语句,指令语句:完成一定操作功能,能够翻译成机器代码的语句,即指令语句与机器指令有对应关系。,伪指令语句(指示性语句):为汇编程序在翻译汇编语言源程序提供有关信息,如分配存储单元,给符号赋值、段的定义等,它不翻译成机器代码。,二、语句格式,指令语句和伪指令语句的格式类似,格式如下: 名字 操作码 操作数/参数 ;注释其中:方括号 的项是可选项,可以省略。一般每行为一个语句,也可用&
2、符号紧接回车之后,表示该行内容的继续。每行语句长128字符。,1、名字,名字:由用户定义的标识符,非数字开头的131个字符,分标号和变量两种。,标号:在代码段中定义,后跟冒号:,位于指令语句左边 。标号有段、偏移及类型三种属性。段属性:定义标号的段其始地址,标号的段属性总是在CS寄存器中。偏移地址:代表从代码段起始地址到标号位置之间的字节数。类型属性:分NEAR和FAR两类,NEAR表示在同一代码段内引用,FAR表示在段外引用。,变量:是位于伪指令或宏指令左边的名字,其后不带冒号,变量可以在任何段出现。变量也有段、偏移和类型三种属性段属性:变量所代表数据单元的段地址(DS、ES或SS)。偏移属
3、性:变量所代表数据单元的段内偏移地址。类型属性:数据变量来说是指该变量对应的数据的字节长度。如字节、字、双字。,标号是一条指令的符号地址,它代表指令目标代码的第一个字节地址。在一个程序段或子程序入口处通常设置一个标号,因此,标号可以作为转移(JMP)或调用(CALL)指令的操作数。而用于伪指令中的名字,可以是变量名、段名、过程名、宏名等,一般不作为JMP和CALL指令的操作数。,同一个程序中,一个标号或变量只能定义一次,不能重复定义。标号通常用作转移指令的地址,变量通常提供操作数的首地址。,指令语句:例 LOP: MOV AX,0000H ;将AX清零,标号,操作码,操作数,注释,伪指令语句:
4、例 BUF1 DB 34H ;定义变量BUF1,初值34H。,变量名,伪指令符,操作数,注释,2、操作项,可以是指令、伪指令或宏指令的助记符。,3、操作数项,可以用常数、寄存器名、存储器操作数、标号、变量或表达式表示。,常数,8086/8088宏汇编中允许如下几种常数:,二、八、十、十六进制常数十进制科学表示法表示的实数,如:12.35E-2字符串常数,如AB值是4142HABCD 41H,42H,43H,44H,存储器操作数,寻址方式表示的存储器操作数,如:BX、SI+2等。标号 ,如:JMP NEXT1变量:指存放在内存单元中的变化的数据。,表达式(分为数值表达式和地址表达式两种),表达式
5、是由常数、寄存器、标号、变量和操作符组合而成。汇编语言循序使用的操作符有:,算术操作符有+、-、*、/和MOD(取余),算术运算符可用于数值表达式和地址表达式中,在使用地址表达式时要注意地址表达式的物理意义。,例如: MOV AL,10*5+4 ;数值表达式 MOV SI,OFFSET BUF+12 ;地址表达式 MOV CX,NUM2-NUM1 ;两地址差送CX MOV CX,NUM2+NUM1 ;无意义,逻辑操作符,有AND、OR、NOT和XOR四个。只用于数值表达式中。例如:AND AL,78H AND 0FH等价于:AND AL,08H OR AL,3 AND 47H等价于:OR AL
6、,3,关系运算符,有EQ(相等),GT(大于), NE(不等)NE(不等), LE(小于或等于),GE(大于或等于),注:关系操作符的两个操作数必须是数字或同一段内的地址,运算结果也为逻辑值,结果为真,用FFFFH表示,结果为假,用0000表示。如: MOV BX,32 EQ 54等价于: MOV BX,66 GT 44等价于: MOV BX,(val LT 5)AND 20) OR(val GT 5)AND 30),若val5时, 结果:,MOV BX,0,MOV BX,FFFFH,MOV BX,20,MOV BX,30,4.2、伪指令,汇编的一些伪指令用于定义符号,定义数据,分配内存单元,
7、伪指令只向汇编语言提供有关信息,不产生机器代码。,一、符号定义伪指令,1、等值伪指令EQU格式:符号名 EQU 表达式功能:给符号名定义一个值、别的符号名、表达式或助记符。,EQU不能给一个符号重复定义,2、等号伪指令 =,与EQU类似,但在同一个程序中,=可以对一个符号重新定义。,3、解除定义伪指令PURGE格式:PURGE符号1,符号2,符号N功能:解除指定符号的定义,解除符号定义后,可用EQU重新定义。,例: X1 EQU 8 PURGE X1 X1 EQU 48,二、数据定义伪指令,格式:变量 操作符 操作数 ;注释功能:给变量定义存储单元。操作符有:DB ,DW,DD,DF,DQ,D
8、T注:用DT定义的十进制数要加后缀D,否则默认为BCD数。,1、操作数是常数或表达式,例:DATA数据段中定义了字节、字和双字变量,DATA SEGMENTVAR1 DB 10HVAR2 DB 10,11,12 DB 0FFH,0BUF1 DW 1234H,5678HBUF2 DD 12345678HDATA ENDS,2、操作数是字符串,当定义的字符串中多于2个字符时,只能用DB定义。如: STR1 DW ABCD ,注: STR2 DB AB STR2 DW BA STR2 DW AB,等价,3、操作数是?,此时,只分配存储单元,不定义初值。,例: NUM1 DB 5,?,7 NUM2 D
9、W ?,?,BUF2 DW 1,2,3 DUP(6)等价于:BUF2 DW 1,2,6,6,6ARB1 DB 10 DUP(2)ARB2 DB 10H DUP(ABC)ARB3 DW 20 DUP(?),DUP操作符允许嵌套,例:BUF3 DB 2 DUP(5,6,3 DUP(7),5,6,7,7,7,等价于:BUF3 DB 5,6,7,7,7,5,6,7,7,7,5、变量(包括标号)定义后,可以完成分析运算和合成运算,分析操作符也叫分解操作符,从变量和标号中分解出某些属性值。分析操作符有:TYPE 、LENGTH、SIZE、OFFSET、SEG。,TYPE 计算变量的类型值或标号的类型值用D
10、B,DW,DD,DF,DQ,DT定义的变量对应的类型值分别是1,2,4,5,8,10;NEAR和FAR对应的类型值分别为-1、-2,LENGTH 变量对于用DUP定义的变量,计算DUP前面的重复次数,其它变量的LENGTH值为1。SIZE 变量计算分配给该变量的字节数,其值为TYPE和LENGTH的乘积。,OFFSET 变量或标号计算变量或标号的段内偏移地址。如:MOV SI,OFFSET TAB1 功能是将TAB1的偏移地址送入SI寄存器中,等价于 LEA SI,TAB1,SEG 变量或标号计算变量或标号的段地址。如:MOV AX,SEG TAB1功能是将TAB1的段地址送入AX寄存中。,合
11、成操作符(PTR和THIS)也叫属性操作符,用来改变原有变量或标号的类型。,例:书4-8, PTR 表达式 ;表达式一般是变量/标号,对于变量,可指定类型为 BYTE/WORD/DWORD对于标号,可指定类型为NEAR(段内)、FAR(段间),例: DA1 DW 345FH MOV AL,DA1; MOV AL,BYTE PTR DA1 ;AL=34H,例: 指令 MOV BX,5 在不能确定是字传送还是字节传送,必须用PTR说明。 MOV BYTE PTRBX,5 ;字节传送 MOV WORD PTRBX,5 ;字传送, ;类型不匹配,4、操作数用复制操作符DUP时,表示操作数重复若干次。,
12、例:BUF1 DB 2(,)等价于:BUF1 DB 2,3,4,2,3,4,可以为连续的存储单元提供重复数据。格式如下:,变量名,DBDWDD,表达式1 DUP(表达式2),其中,表达式1是重复的次数,表达式2是重复数据的内容。,例: 对于如下定义: DA1DW345FH DA2EQUBYTEPTR DA1 DA3EQUDA2+1,利用PTR还可与EQU一起定义与右边表达式类型不同,的新变量/标号,但不分配存储单元,新变量/标号的类型与表达式类型相同。如:TAB1 DW78E2H TAB2 EQU BYTE PTR TAB1TAB3 EQU TAB2+1,THIS 与PTR类似,可以给变量或标
13、号定义另一属性或类型。(但不分配新的存储单元)。一般与EQU或=伪指令连用,产生标号或变量。偏移地址是该语句所在位置的下一个可用存储单元的地址。,VAR1 EQU THIS BYTEVAR2 DW 6918H这样VAR1和VAR2有相同的段属性和寻址空间。 MOV AL,VAR1 ; AL=18HMOV BX, VAR2; BX=6918H,BYTE_VAR EQU THIS BYTE ;定义BYTE_VARWORD_VAR DW 6918H 类型为字节 MOV AL,BYTE_VAR ;AL=18H MOV BX, WORD_VAR ;BX=6918H AGAIN EQU THIS FAR
14、;定义标号 MOV AX,SI AGAIN有 FAR属性 JMP AGAIN,6、变量的类型,用伪指令定义的变量是有类型的,在指令中使用变量做操作数时,要操作数类型的匹配。如:有如下数据定义: OPR1 DB 23H,4AH OPR2 DW 127FH,25A6H则:MOV AX,OPR1 MOV BL,OPR2应使用合成操作符PTR: MOV AX,WORD PTR OPR1; AX=4A23H MOV BL,BYTE PTR OPR2 ; BL=7FH,三、段定义伪指令,DATASEGMENT ;DATA段定义开始 BUF1DB 2DHDATAENDS ;DATA段定义结束EXTRA SE
15、GMENT ;EXTRA段定义开始BUF2DB ?EXTRA ENDS ;EXTRA段定义结束STAKSEGMENT ;STAK段定义开始 TOP DW 50 DUP(?)STAK ENDS ;STAK段定义,CODE SEGMENT ;CODE段定义开始 ASSUME CS:CODE,DS:DATA ;规定段的性质 ASSUME SS:STAK,ES:EXTRASTART: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AX,STAK MOV SS,AX MOV AH,4CH INT 21H,CODE ENDS END START,返回DO
16、S,三、段定义伪指令,格式:段名 SEGMENT 定位 组合类型段长度 ;段体段名 ENDS,1、定位类型 用于通知连接程序,逻辑段的目标代码在存储器中如何存放。即下一个逻辑段的起始地址与上段结尾的间隔值。,PARA:段地址从能被16整除的地址开始依次存放 BYTE:段地址从下一个可用字节开始。 WORD:段地址从偶地址开始依次存放 PAGE:段地址从能被256整除的地址开始依次存放,2、组合类型告诉连接程序如何组合相同名字的段NONE:表示与其他模块的段无关PUBLIC:连接时,本段与其他同名、同类别的段依次连接合并成一个物理段,长度为各段之和。COMMON:将同名、同类别的段相覆盖,长度为
17、各段最长者,四、段寻址伪指令,运行程序时,需要通过段寄存器访问存储单元,ASSUME指令就是用来建立段寄存器与段之间关系,但不能用来设置段寄存器的内容。格式:ASSUME 段寄存器:段名,段寄存器:段名功能:指示相关的段寄存器访问哪个逻辑段。例如:ASSUME CS:CODE,DS:DATA,三点说明ASSUME通常放在代码段的第一个语句ASSUME并没有给段寄存器赋值CS的值由DOS自动给加载的可执行文件赋的,其他段寄存器的值需要通过MOV指令来设置,程序段1:DATASEGMENTPUBLIC VAR1DB5 DATAENDS CODESEGMENTPUBLIC START: CODEEN
18、DS程序段2:DATASEGMENTPUBLIC VAR2DW 2 CODESEGMENTPUBLIC CODEENDS ENDSTART,STACK:指示该段为堆栈段,连接方法与PUBLIC相同。.对于堆栈段,STACK不可少。,3、类别 类别用来区分是代码段、数据段或堆栈段等,使用时必须用单引号括起来,习惯上数据段用DATA,代码段用CODE,堆栈段用STACK,连接程序会把类别相同的逻辑段,存放于连续的存储器中。,4、段长度 分为16位段和32位段 16位段用USER16表示,32位段用USER32表示,例如:若DATA为数据段名则可通过如下方法给DS赋值,MOV AX,DATA MOV
19、 DS,AX 或: MOV AX,SEG DATA MOV DS,AX,五、定位伪指令ORG和地址计数器$,汇编程序在汇编源程序时,每遇到一个段,就会为该段设置一个地址计数器$,用来每个数据或指令在段 中的相对位置即偏移量。在程序中用$来表示地址计数器当前值,段内偏移地址一般从0开始顺序使用,如果需要,可以用ORG来指定以某个单元为起示地址。,例: DATA SEGMENT ORG 10H VAR1 DW 200H,300H ORG $+5 VAR2 DB 15H DUP(0) CONT EQU $-VAR2 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:D
20、ATA ORG 20H BEGIN: MOV AX,DATA ,VAR1在DATA段中的便移量为10HVAR2的便移量为19HCONT为VAR2所占的字节数。在代码段CODE中,第一条指令从便移量为20H单元开始存放。,动态求数据项个数的方法,STRING DB C PROGRAMMINGCOUNTS EQU $-STRING ;COUNTS=13VARW DW 1,2,3,4,5,6COUNTW EQU ($-VARW)/2 ;COUNTW=(6*2)/2=6BUFFER DB 10 DUP(2 DUP(6),A) ;数据的个数为 10*(2+1)=30COUNTL EQU $-BUFFER
21、 ;COUNTL=30MOV CL,COUNTS ;CL=13MOV CX,COUNTW ;CX=6MOV CX, COUNTL ;CX=30,五、简化段定义伪指令 (MASM 5.0以上),1、模式选择伪指令 . MODEL,格式:.MODEL 模式选择符功能:指明所用的内存模式TINY:微模式,四段合一模式,可生成.COM文件SMALL:小模式,一个数据段,一个代码段MEDIUM:中模式,一个数据段,允许多个代码段,用段名区分不同的CS段COMPACT:压缩模式,一个代码段,允许多个数据段LARGE:大模式,可有多个代码段和多个数据段。,2、数据段定义伪指令(.DATA)格式:.DATA名
22、字功能:定义一个数据段,隐含名为DATA3、堆栈段定义伪指令(.STACK)格式:.STACK长度功能:定义一个堆栈段,形成SS和SP,SP的默认值1024,隐含段名STACK4、代码段定义伪指令(.CODE)格式:.CODE功能:定义一个代码段,隐含段名为CODE,5、程序返回伪指令.EXIT格式:.EXIT功能:返回DOS6、程序开始伪指令.STARTUP格式:.STARTUP功能:指示程序的开始位置。并给DS等赋值,六、结束伪指令和模块名伪指令,格式:END标号标号是程序的起始标号。,NAME 模块名TITLE 文本,七、指令集选择伪指令,如:.586 ; 选择Pentium指令集 .5
23、86P; 选择Pentium指令集,包括特权指令,八、过程定义伪指令 格式: PROC NEAR/FAR (缺省为NEAR) RET ENDP,4.3、汇编语言源程序结构,汇编语言源程序采用分段结构,有完整定义,简化定义,程序段前缀结构和.COM文件结构4中结构形式。,一、完整段定义结构,用到的数据段和代码段都用段定义进行定义,并用ASSUME伪指令进行段约定。,二、简化段定义结构,利用简化段定义伪指令进行段的定义,不用ASSUME来规定段的性质,在程序前要说明模式。,三、程序段前缀结构,DOS系统在将任何一个.EXE文件装入存储器时,都会生成一个“程序段前缀”(PSP),程序加载结构,DS,
24、终止用户程序,返回DOS系统的功能,256个字节,程序段前缀结构与完整段定义结构的不同,仅仅在于程序执行完返回DOS 的方法。前者就是通过执行PSP单元的INT 20H来返回DOS。这种方法要求:(1)将程序的代码段设置成一个过程,类型为FAR(2)在给DS赋值前,用下列3条指令将INT 20H的地址DS:0000H压入堆栈, PUSH DS PSP的段基址压栈 MOV AX,0或XOR AX,AX PUSH AX PSP的偏移量压栈,(3)以RET指令结尾,可将压栈的中断指令地址弹出送入CS、IP中,RET指令执行后,就执行“INT 20H”指令返回DOS。,终止用户程序并返回DOS系统的另
25、一方法是,在程序结束时使用以下两条指令: MOV AH,4CH ;MOV AX,4C00H INT 21H INT 21H,四、.COM 文件结构,综上所述:汇编语言程序常用结构模块的方法编写,源程序一般由几个段构成,每个段均以SEGMENT语句开始,以ENDS语句结束。在代码段中又可定义若干个子程序。,堆栈段,数据段,代码段,DEBUG直接编程,4.4 汇编语言的上机过程,(用MASM进行汇编)上机步骤如下:用编辑程序(EDIT.COM)形成汇编语言源程序(.asm文件)用汇编程序(MASM.EXE)对源程序进行汇编,形成目标文件(.obj文件)用连接程序(LINK.EXE)把目标文件转换成
26、可执行文件(.exe),(用TASM进行汇编)上机步骤如下:用编辑程序(EDIT.COM)形成汇编语言源程序(.asm文件)用汇编程序(TASM.EXE)对源程序进行汇编,形成目标文件(.obj)用连接程序(TLINK.EXE)把目标文件转换成可执行文件(.exe),4.4 汇编语言的上机过程,上机步骤如下:,一、建立扩展名为.asm的源文件程序。,可用任何文本编辑器编辑源文件均可。如记事本、WORD、WPS等,通常用DOS自带的EDIT编辑文件。,二、用汇编程序MASM或TASM产生目标文件,MASM是支持宏指令的宏汇编程序(Microsoft公司)TASM也是支持宏指令的汇编程序 (Bor
27、land公司)汇编程序的汇编对象是.asm文件,汇编的结果产生三个文件:.obj 文件 ,默认与源文件同名的二进制目标文件。 .lst 文件,列表文件,此文件包括源程序和机器语言程序清单,以及使用的标号和变量的列表。方便查错。默认不建立。.crf 文件,用于产生交叉引用表文件.ref(.crf文件经过cref.exe文件再处理后,产生.REF交叉引用表文件,可用TYPE 阅读),如果源程序有错,汇编会报告是那类错误,有多少错,其中(warning errors)为警告错误,是一般性错误,不影响.obj文件的生成。若存在严重错误(severe errors)则影响目标文件的生成,需要返回到编辑环
28、境对源程序进行修改,直到没有错为止。,TASM 的完整格式为:E:TASM option source ,object ,listing ,xref,主要Option参数 /l,/c,/z,/zi,例:E:TASM TEST 只生成TEST.OBJ文件 E:TASM TEST/L/ZI 生成TEST.OBJ和TEST.LST 文件(含调试信息),三、用LINK和TLINK程序产生.EXE文件。,因为.obj文件还不是可执行文件,需要经过LINK/TLINK程序处理后,才能得到可执行文件即.exe文件。,格式为:TLINK objectfiles ,exefile ,mapfile ,libfi
29、les,TLINK 的主要参数: /t,/x,/v,/3例:E:TLINK TEST生成TEST.EXE和TEST.MAP文件 E:TLINK TEST/X生成TEST.EXE文件 E:TLINK TEST/X/t/V生成TEST.com文件,注:TEST.ASM必须是COM格式的程序。(含调试信息),LINK有两个输出文件.exe文件和.map文件其中.map文件是连接映像文件,它给出每个段在存储器中的分配情况。,四、程序的执行,在DOS提示符下,直接敲入文件名,一般情况下,执行结果不可见,要用DUBUG来查看,由于汇编程序只能查出语法错误,对于程序的逻辑错误(如:算法、语句的多、少,转移是否正确等)都不能查出,因此汇编语言的正确性,通常需要通过DEBUG或TD调试程序来检验。,YES,上机过程如图:,加快汇编过程的方法MASM ,;一次输入即可得到与源文件程序名相同的.obj .lst和.crf文件。,MASM 源文件名,;一次输入可得到与与源文件程序名相同的.obj 和.lst文件,MASM 源文件名;只生成同名的.obj文件,连接也有类似情况,LINK 目标文件名,;一次输入可得到同名的.exe和.map文件LINK 目标文件名;只生成同名的.exe文件,再见!,