当前位置:文档之家› MASM汇编语言基础概述

MASM汇编语言基础概述


§4.4 程序的段结构
§4.4.1 段定义伪指令 格式: 段名 SEGMENT
…… 段名 ENDS 一个完整的汇编源程序中可以定义多个段,但同时起作用的 最多只有4个。每一个段都是由伪指令SEGMENT开始,由ENDS 结束,SEGMENT和ENDS必须成对出现,并且在SEGMENT和 ENDS的前面都必须有同一个段名;SEGMENT和ENDS语句之 间的省略号部分,对于代码段来说,主要是指令,也可以有伪指 令;对于数据段、附加段和堆栈段来说,一般是存储单元的定义、 分配等伪操作。
4.变量的使用
(1)在指令语句中,如果要对某存储单元进行存取操作,就 可直接引用它的变量名;若操作数采用直接寻址,变量的偏 移量作为操作数偏移量;而操作数若采用了寄存器相对寻址 或相对基址变址寻址,此时变量的偏移量就作为操作数的位 移量。
(2)在伪指令语句中:定义变量时引用了另一个变量,则这 个变量的内容均是被引用变量的逻辑地址。如用DW,则仅 有偏移量,如用DD则前两个字节存放偏移量,后两个字节存 放段地址;注意不能用DB引用变量名。
(2)可用类似DS,ES的装入办法,用几条指令实现对SS和 SP的装入 。
3.CS的装入
用DS、ES的装入办法,那么为装入CS、IP的 新值需要执行几条指令。
对CS、IP的装入通常是:按照END结束伪指 令指定的地址装入CS、IP。任何一个源程序都是 以END伪指令来结束。
格式:END 起始地址
4.注释字段
这是一个可选字段,注释字段必须以分号“;”为开始,它可以 方便程序设计人员对程序或指令加以注释,提高程序的的可读性。
§4.1.2 伪指令语句
伪指令本身不产生与之对应的目标代码。它是在 汇编程序对汇编语言源程序汇编期间,由汇编程序处 理的操作,可以完成数据定义、分配存储区、指示程 序结束等任务。
图4.1 指令语句的格式
一条指令语句有如下4个字段: 1.标号字段
这是一个可选字段。标号必须以“:”作为结束符。一个标号 是一条指令的符号地址,它代表该指令的第一个字节的地址。
2.指令助记符字段
这是一条指令中不可缺少的主要成分。它表示这条语句要求 CPU完成什么操作。 3.操作数字段
参与操作的数据或地址。指令语句可以有一个操作数、两个操 作数或无操作数。
第4章 MASM汇编语言基础
§4.1 汇编语言语句种类及其格式 汇编程序是计算机的系统软件之一,它的作用是将 汇编语言源程序翻译成机器语言程序。
最常用的支持Intel8086/8088系列微机的汇编程 序MASM,是美国Microsoft公司开发较早的宏汇编程序, 它不仅具有ASM的全部功能(支持基本汇编语言),而 且增加了宏指令、结构、记录等高级宏汇编功能。
① 对于DB伪指令,为字符串中每个字符分配一个字节单元。字符串 必须是引号括起来的,不超过255个字符。
② 对于DW伪指令,可以给两个字符组成的字符串分配两个字节的存 储单元,而且这两个字符的ASCII码的存储顺序是前一个字符在高字节, 后一字符在低字节。每一个数据项只能是1~2个字符。相当于定义字。
存储器操作数相对哪个段寄存器,共有4种:DS:、CS:、SS:和ES:
3.SHORT
用来修饰JMP指令中转向地址的属性,指出转向地址是在 下一条指令地址的-128~+127字节范围之内。
4.HIGH/LOW
格式:HIGH 常数或地址表达式 (表示取高字节)
LOW 常数或地址表达式 (表示取高字节)
这两个运算符称为字节分离操作符,它接收一个常数或地 址表达式,HIGH取其高位字节,LOW取其低位字节。其中 地址表达式必须具有常量值,HIGH/LOW运算符用于分离出 段地址或偏移量的高字节/低字节。
表达式中运算符的计算顺序
首先应该计算优先级别高的运算符;然后从左往右地对 优先级别相同的运算符进行计算。
语句(Statement)是汇编语言源程序的基本组成 单位。一个汇编语言源程序有三种基本语句:指令语句、 伪指令语句、宏指令语句。
§4.1.1 指令语句
每一条指令语句在汇编时都要产生一个可供机 器执行的目标代码,因此,也被称为可执行语句。 格式如图4.1所示:
标号 : 指令助记符
操作数 ,
; 注释
表4.1 运算符的优先级别关系表
优先级别
运算符
[ ],(),<>,LENGTH,SIZE,WIDTH,MASK
从 ?(结构域名操作符)
PTR ,OFFSET ,SEG,TYPE,THIS及段跨越前缀 HIGH ,LOW
高 *,/,MOD ,SHL,SHR
+,- EQ,NE,LT,LE,GT ,GE 到 NOT AND OR,XOR 低 SHORT
jin
举例:jia DB 2 DUP (3,0FH,‘a’)
jin DB 3 DUP (2 DUP (?),0E5H),8
jia
00000011
00001111
01100001
00000011 00001111 01100001
其中jia,jin是变量名
11100101
11100101
11100101 00001000
1.SEG
格式:SEG 变量名或标号
当运算符SEG加在一个变量名或标号前面时,汇编程序回送 的运算结果是这个变量或标号所在的段的段基址;
2.OFFSET 格式:OFFSET 变量名或标号
当运算符OFFSET加在一个变量名或标号前面时,汇编程序回 送的运算结果是这个变量或标号所在的段的偏移量;
3.TYPE 格式:TYPE 变量名或标号
§4.3.1 算术运算符 算术运算符有+(加)、-(减)、*(乘)、/(整除)、
MOD(求余)。
§4.3.2 逻辑运算符 逻辑运算符有4个:AND(与)、OR(或)、NOT(非)和
XOR(异或),逻辑运算是按位进行的。
§4.3.3 关系运算符 这6个关系运算符分别是:GT(大于)、GE(大于等于)、
2.变量的三个属性
(1)段属性SEG 它表示变量存放在哪一个逻辑段中。当指令中要对这些变
量进行存取操作时,事先要把它们所在的段的段基址存放到段 寄存器中; (2)偏移量属性OFFSET
表示变量在逻辑段中离段起始点的字节距离。上述段属性 和偏移量属性就构成了变量的逻辑地址; (3)类型属性TYPE
表示变量占用存储单元的字节数(并非总字节数),它由 类型助记符DB、DW、DD、DQ来规定,即由数据定义伪指令 确定的。
序列。(注意:若最高位数是A~F,则前面需加“0”) 5.字符串常量:用单引号或双引号括起来的一个或多个字符,这些字符
用它的ASCII码值存储在内存中。
§4.2.2 变量
变量就是用来表示程序中所用的内存操作数。
1.定义
格式:[变量名] 类型助记符 操作数[,操作数,……]
其中变量名字段是可有可无的,它用于指示内存操作数的 地址(符号地址);操作数字段用于指示内存操作数,汇编程 序将定义的内存操作数,按其类型给它们分配内存单元。
§4.2.3 标号(Label)
1.定义:
标号是一条指令目标代码的符号地址,它常作为转 移指令或调用指令的操作数。
2.标号的三个属性:
(1)段属性:表示这条指令的目标代码在哪个逻 辑段中;
(2)偏移量属性:表示这条指令目标代码的首字 节在段内离段起始点的字节距离;
(3)距离属性(或类型属性)
§4.3 表达式与运算符
§4.4.3 段寄存器的装入
1.DS和ES的装入
在程序中,引用段名就是以立即数形式获取该段的段基址,
而立即数又不能直接送给段寄存器,所以一个段的段基址要经 过通用寄存器传送给DS,ES。
如:MOV AX, DATA MOV DS, AX
用户定义的数据段名
2.SS的装入
装入的办法有两个:
( 1 ) 在 段 定 义 伪 指 令 ( SEGMENT ) 的 组 合 类 型 中 选 择 “STACK”参数,且在段寻址伪指令(ASSUME)中,把堆栈 用的这一个段指派给段寄存器SS。
4.注释字段
这是一个任选字段,它必须以分号为开始,它的作 用与指令语句的注释字段相同。
§4.2 汇编语言数据 通常汇编语言能识别的数据有:常量、变量和标号。 §4.2.1 常量 常量:出现在8086源程序中的固定值。
1.十进制常量:以字母D结尾的0~9的数字序列,其中字母D可以省略; 2.二进制常量:以字母B结尾的0和1组成的数字序列; 3.八进制常量:以字母O或Q结尾的0~7的数字序列; 4.十六进制常量:以字母H结尾的0~9和A~F(或a~f)的数字字母
5.SIZE 格式:SIZE 变量名
运算符SIZE加在变量的前面,汇编程序回送的值等于LENGTH和 TYPE两个运算符返回值的乘积。(实际上就是数据的存储单元数)
§4.3.5 属性修改运算符 这种运算符是对变量、标号或某存储器的类型属性进行修改指
定,它主要有PTR、段跨越前缀、SHORT、HIGH和LOW等5种。
符号名
伪指令
ห้องสมุดไป่ตู้
操作符 ,
; 注释
图4.2 伪指令语句的格式
一条伪指令语句也有如下4个字段:
1.符号名字段
这是一个可选字段。符号名后面不得用冒号“:”, 这是它与指令语句格式上的唯一区别。
2.伪指令字段
这是伪指令语句中不可省略的主要成分。是伪指令语 句要求汇编程序完成的具体操作命令。 3.操作数字段
这是数据项,本字段是否需要,需要几个,需要什 么样的操作数等都由伪指令字段中伪指令来确定。
常用的有以下几种: DB伪指令用来定义字节,其后的每个操作数都占用1个存储单元; DW伪指令用来定义字,其后的每个操作数都占用2个存储单元 (低位字节存放在低地址,高位字节存放在高地址); DD伪指令用来定义双字,其后的每个操作数都占用4个存储单元; DQ伪指令用来定义四个字,其后的每个操作数都占用8个存储单元。
相关主题