资源描述
第3章 MASM伪指令系统v3.1.1汇编语句种类与格式 汇编语言源程序中可以使用3类语句指令性语句伪指令语句宏指令语句(1)、指令性语句 能够被CPU所执行的语句,一条指令性语句对应于一条机器指令,指令性语句的种类取决与CPU的指令系统(2)、伪指令语句 用于控制汇编过程,为汇编器提供必要的辅助信息的语句,如定义变量、定义符号常量等,该类语句也称为指示性语句。(2)、伪指令语句与指令性语句间的区别 伪指令:汇编后不产生任何机器代码 指令性语句:汇编后产生机器代码(3)、宏指令语句 为多次重复使用的一段程序起一个名字,在程序其他地方使用这段程序时,使用名字替代该段程序。被名字替换的这段程序就叫宏。宏展开:将名字还原为程序的过程 宏指令:用名字代替一段程序,宏名形成的指令称为宏指令。第3章 MASM伪指令系统v3.1.2汇编语言语句的格式指令性语句的一般格式为:标号:指令助记符 操作数1,操作数2;注释指示性语句的一般格式为:名字 伪指令定义符 参数,参数;注释(1)、标号、名字 标号与符号统称符号,符号是一个字符串,可以使用字母、数字、特殊符号 字母:az,AZ 数字:09 特殊符号:?._$等(2)、助记符、定义符 助记符:定义了该语句实现的操作 定义符:定义了该伪指令所要实现的操作(3)、参数 用于说明操作的对象,参数的类型和数目随指令或伪指令而变。参数可以是:常数、寄存器数、存储器数(3)、参数常数:二进制常数,由0和1组成,以字母B结尾 八进制常数,由07组成,以字母Q结尾 十六进制常数,以09及AF组成,以字母F结尾 串常量,用引号引起来的字符串,其值为ASCII码(3)、参数算术运算符:+-*/MOD,参与运算的数为整数,结果也为整数 如:ADD AX,100*4+2 SUB CX,101/2(3)、参数逻辑运算符:NOT,AND,OR,XOR,SHR,SHL 例如:MOV AX,1 SHL 3 OR AL,3 AND 58Q(3)、参数关系运算符:EQ,NE,LT,LE,GT,GE 例如:MOV AX,123 GT 3 (3)、参数注释:用于说明程序的作用,可有可无,如果有,以;号开头 v3.2常用伪指令常用伪指令有一下几类符号定义伪指令数据定义伪指令标号析值/属性操作符段定义伪指令3.2.1符号定义伪指令1、等值语句 EQU 格式:变量名 EQU 表达式 作用:通知汇编器,EQU左边和右边是等同的,使用时,用变量名替代表达式 示例:COUNT EQU 15 MOV AX,COUNT3.2.1符号定义伪指令1、等值语句 EQU 使用注意事项:(1)EQU 所定义的符号,仅仅是用于替代右边的字符,不占用存储空间,也不产生目标代码 (2)符号必须先定义后使用 (3)同一源程序中,EQU所定义的符号不能重新定义3.2.1符号定义伪指令1、等号伪指令 格式:变量名=表达式 作用:与EQU类似,但表达式只能是数值表达式,且允许重复定义 示例:COUNT =15 MOV AX,COUNT3.2.2数据定义与变量伪指令1、数据定义伪指令 格式:变量名 DB 初值表达式 变量名 DW 初值表达式 变量名 DD 初值表达式 变量名 DQ 初值表达式 变量名 DT 初值表达式 3.2.2数据定义与变量伪指令1、数据定义伪指令 DB:变量占1个字节存储空间 DW:变量占1个字存储空间 DD:变量占2个字存储空间 DQ:变量占4个字存储空间 DT:变量占5个字存储空间3.2.2数据定义与变量伪指令2、功能:定义变量,并指导汇编器为变量分配指定的存储空间,并初始化为变量定义语句中的初值表达式。示例:B0 DB 2 B1 DB 3,5,?,9 B2 DW 10H,2 DUP(1234H,?)B3 DD 1,2 B4 DB 0,2 DUP(?,1,2 DUP(7)3.2.2数据定义与变量伪指令3、注意事项:(1)每个初值所占用的空间取决于伪指令 (2)如果不想初始化,可以用?号,表示分配空间,但初值不确定 (3)对于重复的初值,可以用DUP描述3.2.2数据定义与变量伪指令4、变量的访问:变量名代表初值表达式列表所对应的存储单元的首地址,变量的访问类似于数组,变量名为该数组的首地址。3.2.2数据定义与变量伪指令5、示例:DA2 DB 1,3,5 MOV AL,DA2 MOV AH,DA2+2 MOV BL,DA2+1 3.2.2数据定义与变量伪指令6、变量的属性:变量定义后,具有以下3个属性:(1)、段属性:变量所在段的段基址 (2)、偏移属性:该变量的段内偏移量 (3)、类型属性:该变量所占用的存储单元 3.2.3标号及其属性1、标号的概念:标号是一条指令的符号地址,它常用作转移指令或子程序调用指令的操作数。3.2.3标号及其属性2、标号的属性:段属性:标号所在段的段基址 偏移属性:标号所指出的机器码的段内偏移量 类型属性:该标号的有效范围,有NEAR类型和 FAR类型3.2.3标号及其属性3、标号的定义:在指令助记符前加上标号,并用冒号:分隔3.2.3标号及其属性4、示例:MOV CX,20AGAIN:ADD AX,AX DEC CX JNZ AGAIN 3.2.4析值/属性操作符1、析值操作符:析值操作符也称地址回送操作符,作用是把变量或标号的地址取出 (1)取偏移地址操作符OFFSET 格式:OFFSET 变量或标号 示例:MOV SI,OFFSET BUF (2)取段基址操作符 SEG 格式:SEG 变量或标号 示例:MOV AX,SEG BUF3.2.4析值/属性操作符2、属性改变操作符:格式:类型 PTR 地址表达式 功能:将地址表达式所指的内存单元临时指定为PTR前面所给定的类型 允许的类型有:BYTE,WORD,DWORD,NEAR,FAR 3.2.4析值/属性操作符2、属性改变操作符:用法:(1)、说明存储单元的类型 MOV BYTE PTR SI,5 (2)、改变存储单元属性 A_BYTE DB 1,2,3,4 MOV AX,WORD PTR A_BYTE (3)、建立FAR标号 L_NEAR :MOV AX,0 L_FAR EQU FAR PTR L_NEAR3.2.5段定义伪指令1、段定义伪指令:格式:段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS3.2.5段定义伪指令1、段定义伪指令:说明:(1)、段名的命名方法同符号的命名方法 (2)、关键字SEGMENT开始一个段的定义,ENDS结束 一个段的定义 (3)、SEGMENT与ENDS之间的内容为一个逻辑段 (4)、段定义的参数可以省略,一般情况都省略3.2.5段定义伪指令1、段定义伪指令:示例:DATA SEGMENT A DB,B DB ABCD DATA ENDS3.2.5段定义伪指令2、地址计数器:每个逻辑段都有一个地址计数器,用于指出该段已经使用的存储单元数,地址计数器名字为:$,在程序中可以使用$读取当前地址计数器的值3、地址计数器的修改伪指令ORG:用于调整地址计数器的值。3.2.5段定义伪指令示例:WW1 SEGMENT A1 DB 3 A2 DW 6,7 COUNT EQU$-A2 ORG$+10 A3 DD 8 ORG 200H A4 DQ?WW1 ENDS3.3、程序的段结构一个简单的汇编语言源程序DATA SEGMENTVAR DB 12HDATA ENDSSTACK SEGMENT STACK DB 300H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX INC VAR MOV AH,4CH INT 21HCODE ENDSEND STRAT3.3.1、源程序的分段结构 段是程序的基本构成单位,8086的汇编程序由若干段组成,一般的小程序由数据段、堆栈段、代码段3个段构成。一个程序必须有代码段,其余段根据需要定义。3.3.2、段假设伪指令格式:ASSUME 段寄存器:段名,段寄存器:段名,功能:设定段和段寄存器的联系,设定好以后访问该段存储单元时可以省略段寄存器。说明:可以多次使用ASSUME伪指令,一条ASSUME伪指令可以设定14段寄存器3.3.3、段寄存器的装填ASSUME指令仅仅告诉汇编器段寄存器与段之间的对应关系,但并没有初始化这些段寄存器,因此必须对段寄存器装入对应的段基址3.3.3、段寄存器的装填(1)、DS和ES的装填 MOV AX,DATA MOV DS,AX3.3.3、段寄存器的装填(1)、SS的装填 第一种方法:定义堆栈段时,指出组合类型为STACK,SS和SP的初始化由操作系统自动完成 第二种方法:雷同DS,ES的初始化 MOV AX,STACK MOV SS,AX MOV SP,300H3.3.3、段寄存器的装填(3)、CS的装填 CS和IP的装填由DOS自动完成3.3.4、DOS的返回 用户程序执行完成后,CPU不会因此停止,而是继续取指令和执行指令,但内存中的数据为随机数,被CPU执行后会得到不可预知的结果。因此用户程序执行完成后,必须返回DOS操作系统。常用的方法时利用DOS功能调用 MOV AH,4CH INT 21H
展开阅读全文