文档介绍:本章学****要点:
(1)常见的伪指令及它们的用法
(2)汇编语言的结构
一、汇编语句的种类和格式
1. 语句的种类
汇编语言有多种类型的语句,指令语句、伪指令语句、宏指令语句。
汇编语言在对源程序进行汇编时,把指令语句翻译成机器指令,也就是说指令语句有着与之对应的机器指令。
伪指令语句没有与其对应的机器指令,只是指示汇编程序如何对源程序进行汇编,包括符号的定义、变量的定义、段的定义等。通俗点讲,它实际上是属于一种说明语句。
指令语句格式:
(标号)指令助记符(操作数(,操作数))(;注释)
伪指令语句的格式如下:
(名字)伪指令定义符(参数,…,参数)(;注释)
伪指令定义符:规定了伪指令的功能
参数:说明伪指令操作的对象,如常数(数值表达式)等
名称:给所定义的内容起的名称。
在汇编语言中,名字和标号很容易区分,名字后面没有冒号,而标号后一定用冒号。
标号和名字最多由31个字母、数字及规定的特殊字符组成,并且不能以数字来开头。
标号和名字不能是汇编语言的保留字,如不能是“MOV”。
汇编语言不区分保留字中字母的大小写。如“MOV AX ,03H”等同于“mov ax , 03h”
伪指令有多种,常见的如:
(1)段定义伪操作
(2)数值数据定义及存储器分配
(3)符号数据定义
(4)程序开始和结束伪操作
(5)表达式赋值伪操作
此外还有基数控制伪操作、对准伪操作等。
看看下列代码有哪些伪指令:
二、常见的伪指令/伪操作
(1)段定义语句
为了与存储器的分段结构相对应,汇编语言的源程序也是由若干个段组成。
1. 段开始和段结束语句
段定义的一般格式如下:
段名 SEGMENT [定位类型] [组合类型] [‘类型’]
……
段名 ENDS
例:一个简单的段如下所示:
DSEG SEGMENT
MESS DB ‘HELLO’, 0DH , 0AH , ‘$’
DSEG ENDS
2. 段使用设定语句
汇编程序根据段开始语句和段结束语句判断出源程序的段划分,为了有效地产生目标代码,汇编程序还要了解各程序段与段寄存器间的对应关系。这种对应关系由段使用设定语句说明。
ASSUME 段寄存器名:段名[,段寄存器名:段名……]
段寄存器名可以是CS,DS,SS和ES。
段名就是段开始和段结束语句中规定的段名。
例如:CS寄存器对应CSEG段,DS寄存器对应DSEG段。
ASSUME CS : CSEG , DS : DSEG
ASSUME伪指令中段名也可以是一个特别的关键字NOTHING,它表示某个段寄存器不与任何段有对应关系。
DSEG1 SEGMENT
VARW DW 12
DSEG1 ENDS
DSEG2 SEGMENT
XXX DW 0
DSEG2 ENDS
CSEG SEGMENT
ASSUME CS:CSEG , DS: DSG1 , ES : DSG2
MOV AX , DSEG1
MOV DS , AX
MOV AX , DSEG2
MOV ES , AX
……
ASSUME DS: DSG2 , ES :NOTHING
MOV AX , DSEG2
MOV DS , AX
……
DSEG ENDS
(2)关于数值数据定义语句及存储器分配
通过数值数据定义语句可以为数据项分配存储单元,并根据需要设置其初值。
还可以用符号代表数据项,此时符号就与分配的存储单元相联系。代表数据项的符号本省称为变量名,与之相对应的存储单元用于存放变量。
1. 数据定义的格式
数据定义语句是最常用的伪指令语句。一般格式如下:
[变量名] 数据定义符表达式[,表达式,……,表达式][;注释]
例如:VARB DB3
WARW DW -1234
BUFF DB 100 , 3+4 , 5*6
1)定义字节数据项(DB)
每一个字节数据项只占用一个字节存储单元
例:COUNT DB 100
DB 0DH ,0AH , ‘$’
TABLE DB 0 , 1 , 4 , 9 , 16
2)定义字数据项(DW)
每一个字数据项只占用两个字节存储单元
例:FLAG DW 2FCDH, 100,-1
VECT DW 0
DW 100H
3)定义双字数据项(DD)
每一个双字数据项只占用四个字节存储单元
例:VECTOR DD 4
FARPTR DD 12345678H, 0
此外,还可以定义8字节的数据项(DQ),10字节的数据项(DT)
4)定义没有初值的数据项
如果数据定义语句中的表达式只是一个问号(?),则表示不预置对应变量的初值,而仅仅是给变量分配存储单