1、2018/3/8,1,本章主要教学内容,1.指令的格式、功能及应用。2.汇编语言源程序4种常见的结构形式。3.汇编语言源程序书写规则、语句格式及程序分段。,本章主要教学目的及要求,1.熟悉汇编语言的基本表达、伪指令语句及应用。2.掌握汇编语言源程序书写规则、语句格式及程序分段。,2018/3/8,2,一个完整程序,语句类型,指令(性)语句,完成一定操作功能,能够翻译成机器代码的语句,指示性语句(伪指令语句),为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码,3.1 语句类型及格式,3.1.1 语句类型,该程序的功能是完成两个字节数据相加。 DATA SEGMENT ;段定义开始
2、(DATA段) BUF1 DB 34H ;第1个加数 BUF2 DB 2AH ;第2个加数 SUM DB ? ;准备用来存放和数的单元 DATA ENDS ;段定义结束(DATA段) CODE SEGMENT ;段定义开始(CODE段) ASSUME CS:CODE,DS:DATA ;规定DATA、CODE分别为数据段和代码段 START: MOV AX,DATA MOV DS,AX ;给数据段寄存器DS赋值 MOV AL,BUF1 ;取第1个加数 ADD AL,BUF2 ;和第2个加数相加 MOV SUM,AL ;存放结果 MOV AH,4CH INT 21H ;返回DOS状态CODE EN
3、DS ;段定义结束(CODE段) END START ;整个源程序结束,伪指令语句,指令语句,2018/3/8,4,3.1.2 语句格式,指令性语句:,格式:名字: 操作码 操作数,操作数 ;注释,伪指令语句:,格式:名字 伪操作 操作数,操作数, ;注释,名字定义满足的规则(1)数字不能作为第一个字符(2)单独的问号(?)不能作为名字(3)最大有效长度为31(4)保留字不能作为名字使用,2018/3/8,5,操作码,含义:指明操作的性质或功能。书写规则:操作码与操作数之间用空格分开。,操作数,含义:指定参与操作的数据。个数:一般指令,1个或2个,也可以没有; 伪指令和宏指令,可以有多个。书写
4、规则:操作数多于1个时,操作数之间用逗号分开,2018/3/8,7,例: D1 EQU 25 D2 EQU X1+12 D3 EQU SI+2,2.等号伪指令 =格式与功能和EQU类似,3.解除定义伪指令PURGE格式:PURGE 功能:解除指定符号的定义,例: Y1=7,例:Y1 EQU 7 PURGE Y1 Y1 EQU 128,EQU与=的差异:同一个程序中 = 可以对一个符号重复定义,EQU不能对同一个符号重复定义例:Y1=7 Y1=128 的定义是正确的 Y1 EQU 7 Y1 EQU 128 的定义是错误的,3.2.1 符号定义伪指令,1.等值伪指令EQU格式: EQU 功能:给符
5、号名定义一个值、别的符号名、表达式或助记符。,3.2 伪指令,2018/3/8,8,3.2.2数据定义伪指令,格式:变量名 伪操作 操作数,操作数, ;注释 功能:为操作数分配存储单元,用变量与存储单元相联系,伪操作 一个操作数占用空间 变量DB 1个字节 字节变量DW 2个字节(1个字) 字变量DD 4个字节(双字) 双字变量DF(386以上CPU)3字单元 三字变量DQ 4字单元 四字变量。DT 10个字节单元 十字节变量,注意:使用DT助记符时,对于10进制操作数,必须给出后缀D,2018/3/8,9,操作数,常数,代表数据,字节数据,例:DATAB DB 18H,-1,30,字数据,例
6、:DATAW DW 18H,2A45H,双字数据,例:DATAD DD 18H,2F3A124BH,表达式,代表内存单元地址,例: ADDR1 DW NEXT ADDR2 DD NEXT,字符串,存放各字符的ASCII码,例:STR1 DB ABCD STR1 DB A, B, C, D STR1 DB 41H,42H,43H,44H,注意:字符多于2个时,只能使用DB定义,?,只分配单元,不定义初值,例:BUF1 DB 5,6,7,? BUF2 DW 56H,78H,?,345FH,例:操作数用复制操作符DUP,表示操作数重复若干次 BUF1 DB 2 DUP(2,3,4) BUF2 DW
7、1,2,3 DUP(6),2018/3/8,10,分析操作符,TYPE ,含义:计算出变量的类型值或标号的类型值类型值: 变量:1、2、4、6、8、10; 标号:-1、-2,LENGTH ,含义:计算分配给使用DUP定义的变量的单元数,其它变量的LENGTH值为1,SIZE ,含义:计算出分配给变量的字节数值:TYPE和LENGTH的乘积,OFFSET ,含义:计算出变量或标号的段内偏移地址,例:MOV SI,OFFSET DAB1,SEG ,含义:计算出变量或标号的段地址,例:MOV AX,SEG DAB1,2018/3/8,11,【例3-6】若有变量定义 DAB1 DB 20,20,20,
8、20,20 DAB2 DB 5 DUP(20) DAW1 DW 20,20,20,20,20 DAW2 DW 5 DUP(20) DAD1 DD 20,20,20,20,20 DAD2 DD 5 DUP(20),则 TYPE DAB1=1,TYPE DAB2=1 TYPE DAW1=2,TYPE DAW2=2 TYPE DAD1=4,TYPE DAD2=4 LENGTH DAB1=1,LENGTH DAB2=5 LENGTH DAW1=1,LENGTH DAW2=5 LENGTH DAD1=1,LENGTH DAD2=5 SIZE DAB1=1,SIZE DAB2=5 SIZE DAW1=2,
9、SIZE DAW2=10 SIZE DAD1=4,SIZE DAD2=20,2018/3/8,12,格式:THIS 含义:将变量或标号定义成指定的类型 变量可指定为BYTE、WORD、DWORD类型 标号可指定为NEAR、FAR类型,合成操作符,PTR,格式: PTR 含义:给表达式强行指定类型 变量可指定为BYTE、WORD、DWORD类型 标号可指定为NEAR、FAR类型,例: DA1 DW 345FH DA2 EQU BYTE PTR DA1 DA3 EQU DA2+1,THIS,例:DATAB EQU THIS BYTE DATAW DW 764EH,注意:变量的类型与其他操作数的匹配
10、。,例:OPR1 DB 23H,4AH OPR2 DW 127FH,25A6H 如下两条指令是错误的: MOV AX,OPR1 MOV BL,OPR2,使用PTR,如下才正确: MOV AX,WORD PTR OPR1;,2018/3/8,13,格式: SEGMENT 定位 组合 类别 属性 ;段体 ENDS,注意:1.完整段定义由SEGMENT和ENDS这一对伪指令实现2.指令后的4个关键字用于确定段的各种属性3.如不指定,则采用默认参数;但如指定,要按上列次序,用途: 在汇编语言程序中定义逻辑段,指定段的名称和范围,并指明段 的定位类型、组合类型及类别。,3.2.3段定义伪指令,1.段定义
11、,2018/3/8,14,定位类型,含义:规定段的起始地址要求,方式,PARA:段地址从段边界开始,BYTE:段地址从字节边界开始,WORD:段地址从字边界开始,PAGE:段地址从页边界开始,2018/3/8,15,组合类型,含义:规定本段与其他段的关系,方式,NONE:与其他段在逻辑上没有关系,PUBLIC:与其它同名、同类别的段相邻地连在一起,COMMON:与其他同名、同类别的段相覆盖,MEMORY:几个逻辑段连接时,本段定位在地址最高的地方,STACK:此段为堆栈段,连接方式与PUBLIC段相同,AT表达式 :本逻辑段根据表达式求值的结果定位段地址,2018/3/8,16,类别,含义:指
12、出各程序模块中类别相同的段,将它们连接在同一物理段内,连接方式:将所有的同类别段相邻分配,类别名称:可以任意,属性类型,含义:规定16位段或32位段,表示方式,USE16:表示16位段,USE32:表示32位段,注意:大多数MASM程序使用 code、data和stack来分别指名代码段、数据段和堆栈段。,2018/3/8,17,ASSUME :NOTHING ;取消段性质的规定,2.指定段址伪指令,格式: ASSUME :,:,功能:建立段寄存器与段的缺省关系,注意: ASSUME伪指令并不为段寄存器设定初值,3.设置段地址值,含义:在程序的代码段开始处进行DS、SS、ES的段基址装填。,例
13、:MOV AX,DATA MOV DS,AX,格式:ORG 表达式功能:设置某个单元的起始地址,例:DATA SEGMENT ORG 100H X DB 12H Y DW ? ORG 200H Z DD 9C56H DATA ENDS,4.ORG伪指令,2018/3/8,18,5.地址计数器$的使用,含义:表示下一个可用单元的地址,例:ORG $+8 ARRAY DW 1,2,$+4,3,4 假设ARRAY的偏移地址为0074H,则$+4中$的值为0078H,应用:常用来确定数组中元素的个数,例:BUF1 DB 1,2,3,4,5 CNT1 EQU $-BUF (常用) BUF2 DW 1,2
14、,3,4,5 CNT2 EQU ($-BUF2)/2 CNT1、CNT2的值分别为数组BUF1、BUF2中数据元素的个数,2018/3/8,19,格式:.MODEL 模式选择符功能:指明简化段所用内存模式,模式选择符,TINY:微模式,所有数据及代码放入同一个物理段内,SMALL:小模式,程序中只有一个数据段和一个代码段,MEDIUM:中模式,程序中有一个数据段、多个代码段,COMPACT:压缩模式,程序中有多个数据段、一个代码段,LARGE:大模式,程序中有多个数据段、多个代码段,3.2.4简化段定义伪指令,1.模式选择伪指令.MODEL,2018/3/8,20,2.数据段定义伪指令.DAT
15、A,格式:.DATA 名字功能:定义一个数据段,注意:如果有多个数据段,则用名字区别。只有一个数据段时,隐含段名为 DATA,3.堆栈段定义伪指令.STACK,格式: .STACK 长度功能:定义一个堆栈段,并形成SS及SP的初值,注意: SP的默认值为1024,隐含段名为 STACK,4.代码段定义伪指令.CODE,格式: .CODE 名字功能:定义一个代码段,注意:如果有多个代码段,则用名字区别。只有一个代码段时,隐含段名为 CODE,5.程序返回伪指令.EXIT,格式: .EXIT功能:返回DOS,6.程序开始伪指令.STARTUP,格式: .STARTUP功能:指示程序的开始位置,20
16、18/3/8,21,3.2.5程序开始和结束伪指令,NAME伪指令,格式:NAME 模块名功能:汇编程序将用此名作为模块名,TITLE伪指令,格式:TITLE 文本功能:在没有NAME时,用其前6个字符作为模块名,END伪指令,格式:END 标号功能:表明源程序的结束,2018/3/8,22,3.2.6指令集选择伪指令,选择指令集的指令都以点(.)作为引导,程序中使用时放在段外,一般放在程序的开始部分,对整个源程序起作用。,.8086:选择8086/8088指令集,此伪指令可以省略。.286:选择80286指令集,不包括特权指令。.286P:选择80286指令集,包括特权指令。.287:选择8
17、0287数字协处理器指令集。.386:选择80386指令集,不包括特权指令。.386P:选择80386指令集,包括特权指令。.387:选择80387数字协处理器指令集。.486:选择80486指令集,不包括特权指令。.486P:选择80486指令集,包括特权指令。.586:选择Pentium指令集,不包括特权指令。.586P:选择Pentium指令集,包括特权指令。,2018/3/8,23,3.2.7过程定义伪指令,过程定义伪指令,格式: PROC NEAR/FAR RET ENDP,功能:把具有独立功能的程序段定义为过程,供其它程序调用,2018/3/8,24,3.3 汇编语言源程序结构,完
18、整段定义结构:用段定义伪指令,对用到的逻辑段分别定义,典型的结构:数据段名 SEGMENT 数据段名 ENDS堆栈段名 SEGMENT 堆栈段名 ENDS代码段名 SEGMENT ASSUME START:段地址装填 MOV AH,4CH INT 21H 代码段名 ENDS END START,【例3-11】求字存储单元中两个数之差,结果存入下一个相邻的字单元中。NAME EXAMPLEDATA SEGMENTBUF DW 3483H,4596HRES DW ? DATA ENDSSTACK SEGMENT STACK STACK STA DW 100 DUP(?)STACK ENDSCODE
19、 SEGMENT ASSUME CS:CODE.DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,BUF SUB AX,BUF+2 MOV RES,AX MOV AH,4CH INT 21H CODE ENDSEND START,2018/3/8,25,简化段定义结构,典型的结构: .MODEL SMALL .DATA .STACK .CODESTART:MOV AX,DATA MOV DS,AX MOV AH,4CH INT 21H END START,例: NAME EXAMPLE .MODEL SMALL .DATA BUF DW 3483H,4596
20、H RES DW ? .STACK 200 .CODE MOV AX,DATA MOV DS,AX MOV AX,BUF SUB AX,BUF+2 MOV RES,AX MOV AH,4CH INT 21H END START,含义:把整个程序定义成一个FAR型过程,2018/3/8,26,例:三个数相加并把结果存放在SUM单元中 DATA SEGMENT BUF DB 35H,78H,0A5H SUM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASUM PROC FAR START:PUSH DS MOV AX,0 PUSH AX
21、MOV AX,DATA MOV DS,AX,程序段前缀结构,含义:把整个程序定义成一个FAR型过程,MOV AL,0 MOV SI,OFFSET BUF ADD AL,SI INC SI ADD AL,SI INC SI ADD AL,SI MOV SUM,AL RET ASUM ENDP CODE ENDS END START,COM文件结构,含义:包括EXE文件和COM文件,2018/3/8,27,本章小结,本章主要介绍了语句格式、伪指令、汇编语言的源程序结构等内容。 汇编语言的语句由4部分组成:名字、操作码、操作数、注释。 伪指令只是向汇编程序提供某些信息,本身并不形成机器代码。 汇编语言的源程序有4中常见的结构形式: 完整段定义结构、简化段定义结构、程序段前缀结构、COM文件结构。,