,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,汇编语言语法,汇编语言语法,1,data SEGMENT,;数据段,var DB ?,data ENDS,code SEGMENT,;代码段,ASSUME CS:code,DS:data,start: MOV AX, data,MOV DS , AX,MOV var, CL,MOV AH , 4CH,INT 21H ;返回DOS,code ENDS,END start,例:,一、汇编语言程序格式段结构,整个源程序由段组成,段名通过伪指令进行定义,每个段由若干语句组成,整个源程序以END结束,data SEGMENT ;数据段例:一,2,data SEGMENT,;数据段,var DB ?,data ENDS,code SEGMENT,;代码段,ASSUME CS:code,DS:data,start: MOV AX, data,MOV DS , AX,MOV var, CL,MOV AH , 4CH,INT 21H ;返回DOS,code ENDS,END start,例:,一、汇编语言程序格式语句结构,data SEGMENT ;数据段例:一,3,1. 名字项,据语句功能的不同,,名字项可用来表示:,段名、变量名、标号、过程名以及常量名,等。,当为指令性语句,该项为标号,必须加“ :”,当为伪指令语句时,该项为名字,没有“ :”,data,SEGMENT,; 数据段,var,DB ?,data ENDS,code SEGMENT,;,代码段,ASSUME CS:code,DS:data,start:,MOV AX, data,MOV DS , AX,MOV,var,CL,MOV AH , 4CH,INT 21H ;返回DOS,code ENDS,END start,1. 名字项,4,名字项用一个符号表示。,对符号的规定:,由字符AZ ,az ,09及特殊符号(,$,_,.,?) 等组成,最长31个字符,超出部分忽略。,不能用数字打头,以免与十六进制数相混。,不使用汇编程序中的保留字。 (如指令的助记符等),对定义的符号不区分大小写。,名字项用一个符号表示。,5,2. 助记符项,助记符可以是指令、伪操作中的助记符。,对于指令,,汇编程序将其翻译成机器语言指令。,MOV,AX, 100 ,B8,00 01,对于伪操作,,汇编程序据其要求的功能进行处理。,data,SEGMENT,data与一段值对应,string,DB,Tsinghua,string与一内存地址对应,2. 助记符项对于指令,汇编程序将其翻译成机器语言指令。对于,6,3,操作数项,操作数给出参与操作的数或数所在的地方。,操作数多于一个时,用逗号分开。,操作数可以是,常数,、寄存器、存储器操作数、,标号名、过程名或,表达式,等。,3操作数项,7,4注释项,由分号引出,用来说明语句或程序的功能。,汇编程序对分号后的内容不做处理。,作用:,注释程序,增强程序可读性。,可放在语句最前,暂时注释某语句,调试程序用。,例,、,;,MOV AH, 2,;显示提示信息,;,MOV DL, A,;,INT 21H,、,4注释项,8,常量,二进制xxxxxxxxB01000101B,八进制xxxO或xxxQ721O或721Q,十进制xxxx或xxxxD1991或1991D,十六进制xxxxH0F1D4H,字符串xxx或“xxx”AB,数值常量,符号常量(用EQU或=定义),二、基本数据常量、变量、标号,二进制xxxxxxxxB01000101B数值常量二、,9,字符常量,用单引号表示。 如 1234,A、B、C、D、E、F开头的十六进制数前面加,0,,,与H结尾的标识符区别。,如 寄存器名AH、BH、CH、DH,变量名 abcdH 等,例,mov AL,0,AH,mov AL, AH,mov BX,0,abcdH,注意,:3个及其以上的字符, 只能用DB定义,str1 DW abcd,str2 DD abcd,字符常量,用单引号表示。 如 123,10,内存单元的名字,由DB/DW/DD/DQ/DT定义,BUF DB ?,MOV BUF,AL,变量的三种属性:,段值 SEG,偏移量 OFFSET,类型 BYTE/WORD/.,变量,内存单元的名字,由DB/DW/DD/DQ/DT定义变量,11,指令存放单元的符号地址,是转移/调用/循环指令的操作数,标号的三种属性:,段值 SEG,偏移量 OFFSET,类型 NEAR/FAR,标号,指令存放单元的符号地址,是转移/调用/循环指令的操作数标号,12,伪指令语句没有对应的机器代码,经汇编后不产生目标代码,主要完成变量的定义、存储器的分配、段的定义和分配、过程的定义、程序开始和结束指示等,三、伪指令语句,伪指令语句没有对应的机器代码,经汇编后不产生目标代码三、伪指,13,定义变量、分配存储单元等,变量名 DB/DW/DD/DQ/DT 操作数,操作数,功能:把操作数存入以变量名所指示的存储单元为首地址的存储区中,操作数可以是:常数、字符串、变量、数值表达式、?、N DUP表达式等,VAR1 DW 1234H,VAR2 DB 12H, 23H, 34H,VAR3 DB This is a string,VAR4 DW ?,?表示未初始化的数,1、数据定义伪指令,定义变量、分配存储单元等操作数可以是:常数、字符串、变量、数,14,1、数据定义伪指令,注意,:3个及其以上的字符, 只能用DB定义,str1 DW abcd,str2 DD abcd,DB定义字节,表示每个操作数占用一个字节,DW定义字,表示每个操作数占用2个字节,DD定义双字,表示每个操作数占用4个字节,DQ定义四个字,表示每个操作数占用8个字节,DT定义10个字节,表示每个操作数占用10个字节,1、数据定义伪指令注意:3个及其以上的字符, 只能用DB定义,15,(1)赋值伪指令EQU,标识符 EQU 操作数,ABC EQU 2000H,XYZ EQU BP+5,新标号 EQU 老标号,AAD EQU PAR_3,COUNT EQU CX,赋值伪指令EQU定义后的标识符不能重复定义,(2)等号伪指令“=”,标识符 = 操作数,与EQU执行过程类似,允许标识符重复定义,2、标识符赋值与解除伪指令,(1)赋值伪指令EQU2、标识符赋值与解除伪指令,16,(3)解除伪指令PURGE,PURGE 标识符1,标识符2,标识符3,,对EQU定义过的标识符进行解除,可重新定义,(4)别名定义伪指令LABEL,格式: 别名 LABEL 类型属性,例如 BYTE-ARRAY LABEL BYTE,WORD-ARRAY DW 100 DUP(?),MOV WORD-ARRAY, 0把第一个字置0,MOV BYTE-ARRAY, 0把第一个字节置0,2、标识符赋值与解除伪指令,(3)解除伪指令PURGE2、标识符赋值与解除伪指令,17,段名SEGMENT 定位类型 组合类型 分类名,段体,段名ENDS,SEGMENT/ENDS总是成对使用,以指定段的名称和范围,通常用DATA作为数据段的段名,CODE作为代码段的段名,STACK作为堆栈段的段名.,3、段定义伪指令,(1)SEGMENT/ENDS,伪指令,段名SEGMENT 定位类型 组合类型,18,定位类型(定位方式):给出了实际段起点的类型。缺省为,PARA,PAGE指定起始地址低8位是0,即值可以被256整除(页边界),PARA指定起始地址低4位是0,即值可以被16整除(段边界),WORD指定起始地址最低位是0,即值可以被2整除(字边界),BYTE指定起始地址是任意值, 0 0 0 0 0 0 0 0 PAGE, 0 0 0 0 PARA, 0 WORD, BYTE,定位类型,定位类型(定位方式):给出了实际段起点的类型。缺省为PARA,19,确定各个逻辑段的组合方式。缺省时为NONE,认为该段不准备与其他同名段相连接的,PUBLIC:告诉连接程序将本段与其他同名段连接起来,公用 一个起点地址,形成一个物理段,COMMON:本段与同名同类别的段公用同一段起始地址,即同名同类段相重叠,段长度即为最长段的长度,AT表达式:本段定位在表达式指定的段地址处,STACK:表明本段是堆栈段,连接方式同PUBLIC,连接后段起始地址在SS寄存器中,MEMORY:本段在连接时定位在所有段之上,即最高地址处,分类名,:,使用时须用单引号括起来,凡分类名相同的段在连接时均按照先后顺序连接起来,组合类型,确定各个逻辑段的组合方式。缺省时为NONE,认为该段不准备与,20,ASSUME,段寄存器:段名,段寄存器:段名,功能:定义当前有效的四个逻辑段,指明段与段寄存器的关系;,ASSUME语句通常作为代码段的第一条语句,一般数据段和代码段是必须的,(2)段分配伪指令ASSUME,ASSUME 段寄存器:段名,段寄存器:段名,21,代码段寄存器CS的值由系统在初始化时自动设置,其他段寄存器的初始化一般在程序开始,将段基址装入,例: ASSUME CS:CSEG, DS:DSEG,ASSUME,是伪指令,段寄存器实际地址值的装入必须通过指令语句,CSEG SEGMENT,ASSUME CS: CSEG, DS:DSEG,MOV AX, DSEG,MOV DS, AX,CSEG ENDS,代码段寄存器CS的值由系统在初始化时自动设置例: ASSUM,22,4、过程定义伪指令,格式:过程名 PROC 属性(NEAR 或FAR),RET,过程名 ENDP,调用格式为: CALL 过程名,PROC, ENDP, NEAR, FAR,功能:定义一个主程序可以用CALL调用的过程,4、过程定义伪指令格式:过程名 PROC 属性(NEAR,23,5、程序开始与结束伪指令,格式: NAME 程序名,TITLE 文本名,(1)目标模块命名NAME、TITLE,功能:为源程序目标模块赋一个 程序名,5、程序开始与结束伪指令格式: NAME 程序名(1)目标,24,格式: ORG 表达式,作用:给出该定位指令下一条指令的起始偏移地址。即把下一条语句定义的内存数据或是程序从表达式的起点(偏移地址)开始连续存放,直至遇到新的ORG指令。表达式的值为无符号数,ORG 2000H,(IP=2400H),ORG 2464H,在2400H和2464H间空出100个字节的存储空间,(2)定位伪指令ORG,格式: ORG 表达式(2)定位伪指令ORG,25,(3)程序结束指令END,格式:,END,标号,说明源文件结束,并给出执行程序的入口地址(标号),(3)程序结束指令END格式: END 标号,26,6、方式定义伪指令,功能:确定汇编程序的操作方式,.8086默认操作方式,.386运行于386方式下,可使用32位寄存器,6、方式定义伪指令功能:确定汇编程序的操作方式,27,7、结构定义伪指令,(1)结构定义,格式: 结构名 STRUC,数据定义语句,结构名 ENDS,结构定义不真正为结构分配存储空间,他是在汇编时进行结构说明的,(2)结构存储单元分配及赋值,格式: 结构变量名 结构名 ,(3)结构引用,格式: 结构变量名. 字段名,7、结构定义伪指令(1)结构定义,28,8、分组伪指令GROUP,格式:,组名 GROUP 段1,段2,,功能:将各个逻辑段放在同一个64K的物理段内,并给它取个新的名字,即组名,8、分组伪指令GROUP格式:,29,9、其他伪指令,公用符号伪指令,格式:,PUBLIC,标识符,指出可被其他模块引用的符号名,可以是变量名、标号、过程名或符号常量,引用符号伪指令,格式:,EXTRN,标识符:类型 ,指出所要访问的其他模块定义的标识符。若标识符为标号,类型为NEAR/FAR;若标识符为变量,则类型为BYTE/WORD/DWORD,(1)访问外部标识符的伪指令EXTRN, PUBLIC,9、其他伪指令公用符号伪指令(1)访问外部标识符的伪指令EX,30,(2)对准伪指令EVEN,格式:EVEN,功能:使下一条语句的地址调整为偶地址,(2)对准伪指令EVEN格式:EVEN,31,(3)条件编译伪指令(MASM提供),格式: IF;如果条件成立,ELSE;否则,ENDIF;结束条件汇编语句,(3)条件编译伪指令(MASM提供)格式: IF;如,32,data1 SEGMENT,;数据段1, (可据需要设定,也可无),;变量定义,data1 ENDS,data2 SEGMENT,;,数据段2 (可据需要设定,也可无),data2 ENDS,code SEGMENT,;,程序段,ASSUME CS: code, DS:data1, ES:data2,start:,MOV AX,,data1,;程序主体部分,MOV DS,,AX,、,、,MOV AH, 4CH,;返回DOS,INT 21H,code ENDS,END start,完整汇编语言程序框架:,data1 SEGMENT ;数据段1,,33,DATA SEGMENT,MESSAGE DB Hello world!“,0DH,0AH,DB This is my first asm program.$,DATA ENDS,SSEG SEGMENT STACK,DB 100 DUP(?),SSEG ENDS,CSEG SEGMENT,ASSUME CS:CSEG,DS:DATA,SS:SSEG,START:,MOV AX,DATA,MOV DS,AX,MOV DX,OFFSET MESSAGE,MOV AH,9,INT 21H,MOV AH,4CH,INT 21H,CSEG ENDS,END START,完整的段定义,DATA SEGMENT 完整的段定义,34,由操作数和运算符组成的序列,操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量),运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算符,四、表达式,由操作数和运算符组成的序列四、表达式,35,由常量、标号、变量和一些操作符构成。,汇编程序对表达式进行运算后,得到一个确定的数值, 再把这个数值汇编到指令中。,据表达式所表示的内容分:,数字表达式、地址表达式,。,表达式是指令或伪操作的操作数;,表达式中的操作符由汇编程序完成。,例,MOV AX,12,-,4,;MOV AX, 8,;,数字表达式,LEA BX, ,SI + 4,;,地址表达式,表达式,表达式,36,(1)算术运算符,+、-、*、/、MOD、SHL、SHR,(2)逻辑运算符,AND、OR、NOT、XOR,(3)关系运算符,EQ、NE、LT、GT、LE、GE,AND AX, ( (N LT 5) AND 30) OR ( ( N GE 5) AND 20),当N=5时,指令为AND AX, 20,运算符,(1)算术运算符AND AX, ( (N LT 5) AND,37,SEG,变量/标号返回段基址,OFFSET,变量/标号返回偏移量,TYPE,变量/标号返回类型,变量返回类型:1 字节、2 字、4双字,标号返回类型:-1 NEAR、-2 FAR,LENGTH,变量返回数据项总数(针对DUP表达式),SIZE,变量返回字节总数,(4)分析运算符(数值返回运算符),SEG 变量/标号返回段基址(4)分析运算符(数值返回,38,YY DW 6 DUP (?),则:,LENGTH YY=6,SIZE YY=12,TYPE YY=2,SEG,取符号地址的段地址,OFFSET,取符号地址的偏移地址,例 MOV AX , SEG YY,MOV BX , OFFSET YY,DATA SEGMENT,XX DB Hello!,DATA ENDS,EXTRA SEGMENT,YY DW 6 dup (?),EXTRA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA, ES:EXTRA,START:,CLD,MOV AX ,SEG YY,MOV ES , AX,MOV DI ,OFFSET YY,MOV CX , 6,.,CODE ENDS,END,START,YY DW 6 DUP (?) SEG 取符号地址的段,39,注意,:,SEG、OFFSET只能对变量或标号(符号地址)操作,MOV AX,SEG,BX,MOV BX,OFFSET,SI,注意:SEG、OFFSET只能对变量或标号(符号地址)操作,40,(5)合成运算符(属性运算符),(1)段操作符,格式:,段前缀:变量或地址表达式,用来表示某个变量或地址被修改到哪个段寄存器提供的段基址中,MOV AX,ES:SI,(5)合成运算符(属性运算符)(1)段操作符,41,(2)PTR,定义符号名为新类型,格式:类型,PTR,表达式,MOV WORD PTR 1000, 0,MOV WORD PTR 1000, 0,可以重新定义已定义过的变量或是标号,若已定义DATA3为字变量,可以有,MOV BYTE PTR DATA3,AL,(2)PTR定义符号名为新类型,42,(3)THIS,与PTR类似,为某个符号名建立新类型,常与EQU联用,格式:,THIS,类型,XYZ EQU THIS BYTE,相当于,BYTE PTR XYZ,LABC EQU THIS BYTE,LABD DW 4321H,2255H,MOV AL,LABC;AL=21H,MOV AX,LABD;AX=4321H,(3)THIS,43,(4)SHORT,格式:,SHORT,标号,功能:用来指出转移类指令中目的地址的属性,(5)HIGH、LOW,格式:,HIGH,标号或变量,LOW,标号或变量,功能:对一个数或地址,HIGH从中分离出高位字节,LOW从中分离出低位字节,(4)SHORT,44,指令语句又叫可执行语句,每一条指令语句对应CPU的一种特定操作,在汇编时将产生一个可供机器执行的机器目标代码,指令语句中必须包含一个指令助记符和充分的寻址信息,五、指令语句,指令语句又叫可执行语句,每一条指令语句对应CPU的一种特定操,45,data SEGMENT,;数据段,var DB ?,data ENDS,code SEGMENT,;代码段,ASSUME CS:code,DS:data,start:,MOV AX, data,MOV DS , AX,MOV var, CL,MOV AH , 4CH,INT 21H,;返回DOS,code ENDS,END start,例:,指令语句结构,data SEGMENT ;数据段例:指,46,宏指令是源程序中具有独立功能的一段程序代码,只需定义一次,可重复调用,六、宏指令语句,宏指令是源程序中具有独立功能的一段程序代码六、宏指令语句,47,宏指令定义语句,宏指令名 MACRO,宏体,ENDM,PUSHREGMACRO,PUSH AX,PUSH BX,PUSH CX,PUSH DX,ENDM,(1)宏定义,宏指令定义语句宏指令名 MACRO PUSHR,48,宏指令名 MACRO 参数1,参数2,参数n,宏体,ENDM,LOADW MACRO PR,VAR,MOV PR,VAR,MOV AX,PR,ENDM,LOADW SI,WVAR,*,MOVSI,WVAR,MOV AX,SI,带参数的宏指令,宏指令名 MACRO 参数1,参数2,参数nLOAD,49,宏指令名 参数列表,(2)宏调用,LOADW MACRO PR,VAR,MOV PR,VAR,MOV AX,PR,ENDM,LOADW SI,WVAR,*,MOVSI,WVAR,MOV AX,SI,宏指令名 参数列表(2)宏调用LOADW MACRO,50,(3)宏展开,宏展开是用宏定义时设计的宏体去代替相应的宏指令名,并且用实际参数一一取代形式参数,宏展开由汇编软件MASM进行,(3)宏展开宏展开是用宏定义时设计的宏体去代替相应的宏指令名,51,(4)宏嵌套,宏嵌套是指宏定义中使用宏调用或宏定义中包括宏定义,(4)宏嵌套宏嵌套是指宏定义中使用宏调用或宏定义中包括宏定义,52,使用宏时,可能会导致变量、标号重定义的问题,使用LOCAL伪指令可以解决这一问题。在宏展开时将用?0000,?0001,来依次代替各标号,格式:LOCAL 变量/标号列表,SOMEMACRO MACRO,LOCAL L1, L2,L1:.,L2:.,ENDM,(5)宏定义中的标号,使用宏时,可能会导致变量、标号重定义的问题,使用LOCAL伪,53,宏指令调用比子程序调用快,子程序调用由微处理器完成,用CALL实现,宏指令调用在汇编过程中由汇编程序完成,子程序调用可以减小目标程序的大小,节约内存空间;宏指令调用不能,宏指令比子程序灵活,宏指令与子程序的区别,宏指令调用比子程序调用快宏指令与子程序的区别,54,