电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> 计算机学习>>格式与伪指令:

格式与伪指令

来源:网络 | 2007-1-29 | (有4138人读过)

1. 三种基本语句
汇编语言源程序的基本组成单位是语句。源程序可使用的语句有三种:指令语句、伪指令语句和宏指令语句(或宏调用语句)。前两种是最常见、最基本的语句。
(1)指令语句
每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句。每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位、…等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于汁算机内的中央处理器(CPU)、存储器、I/O接口等硬件设备来实现的。
(2)伪指令语句
     伪指令语句是用于指示(命令)汇编程序如何汇编源程序,所以这种语句又叫命令语句。例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中哪些是当前段,它们分别由哪个段寄存器指向;定义了哪些数据,存储单元是如何分配的…等等。伪指令语句除定义的具体数据要生成目标代码外,其他均没有对应的目标代码。伪指令语句的这些命令功能是由汇编程序在汇编源程序时,通过执行一段程序来完成的。而不是在运行目标程序时实现的。
(3)宏指令语句 (或宏调用语句)
     一条宏指令语句由一系列指令语句或伪指令语句构成,由汇编程序汇编时展开成若干条指令。用于提高编程效率。将在第七章介绍。
2.  语句格式
指令语句与伪指令语句有相同的格式,由四项组成:
    [标识符/语句标号]  操作  [操作数序列]  [;注释]
    [  ]表示可选项。
(1)   标识符
标识符可以是变量名,段名及过程名等。合法的标识符由数字、字母和字符“?.@_
$”组成,不能以数字开头。点号‘.’只能用作标识符的第一个字符。标识符长度不限,但只有前31个字符有效。此外,源程序中大、小写字母等效;标识符后加“:”就构成语句标号。
     例如:
          DATA  SEGMENT
          MAIN  PROC  FAR
          X    DB  9
          EXIT:  RET
在上例中,DATA为段名。MAIN为过程名,X为变量名,EXIT:为语句标号。
  ·标号:标号在代码段中定义,后面跟着冒号:,给一条汇编指令的开始地址分配一个符号名。
    标号有3种属性;段、偏移及类型。
     段属性:定义标号的段起始地址,此值放在段寄存器CS中。
     偏移属性:标号的偏移地址是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。
     类型属性:用来指出该标号是在本段内引用还是在其它段中引用的。对于16位段,如在段内引用的,则称为NEAR,指针长度为2字节;如在段外引用,则称为FAR,指针长度为4字节。
  ·变量:变量在除代码段以外的其他段中定义,后面不跟冒号。它也有段、偏移及类型三种属性。
   类型属性:变量的类型属性定义该变量所保留的字节数。如DB(BYTE  1个字节长)、DW(WORD 2个字节长)、DD(DWORD 4个字节长)、DQ(QWORD 8个字节长)、DT(TBYTE 10个字节长)。
    在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。
(2) 操作项
      机器指令、伪指令和宏指令的助记符。操作项可以是指令、伪操作或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪操作,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。
(3) 操作数序列
      各操作数之间用逗号隔开,可以是常数、变量、表达式、寄存器名或标号等、随指令类型不同而异。
(4)注释符
     ";"后面可给出程序语句注释。  
伪操作
   伪操作一览表
1.处理器选择伪操作 
本伪指令一般放在整个程序的最前面,告诉汇编程序应该选择哪一种指令系统。
格式:
.8086   选择8086指令系统  (默认)
.486    选择80486指令系统
.486P   选择保护方式下的80486指令系统
.586    选择80586指令系统
.586P   选择保护方式下的80586指令系统   
2.段规定的伪操作 
(1)段的定义
 格式:段名  SEGMENT [定位类型][组合方式] [使用类型] [‘类别’]
         …….
      段名  ENDS
     伪指令SEGMENT表示一个段的开始, ENDS表示一个段的结束,在这两个伪指令之间可以编写各种语句序列。一个程序可以构造任意多个段,每一个段都必须用伪指令SEGMENT/ENDS作为段的开始和结束。
定位类型——用于表示对该段的起始边界的要求
PAGE(页)——起始地址可以被256整除(XXX00H)
PARA(节)——起始地址可以被16整除(XXXX0H)
DWORD(字)——起始地址可以被4整除(XXXXNH)(N为4的倍数)
WORD(字)——起始地址可以被2整除(XXXXNH)(N为偶数)
BYTE(字节)——起始地址可以被1整除(XXXXXH)
缺省为PARA
组合类型
组合类型表示段与段之间的连接。可以是:
    ① PRIVATE  这是隐含选择。表示本段与其他模块中的同名段无连接关系,按照在源程序中各个逻辑段的自然顺序依次在存储器中分配段存储单元。
    ② PUBLIC  表示将本段与其他模块中的同名段、并用PUBLIC 说明的段连接在一起,形成一个新的逻辑段。
    ③ COMMON  产生一个覆盖段。表示本段与其他有相同段名、并用COMMON说明的段设置相同的段起始地址,共享相同的存储区。共享存储区的长度由同名段中最大的段确定。
④ STACK  将其他模块中的同名段       组合而形成一个堆栈段。
使用类型
使用类型用来说明使用16位寻址方式还是32位寻址方式。
① USE16 使用16位寻址方式  (缺省方式)
② USE32 使用32位寻址方式
'类别'
    类别告诉该段的类型,连接时类别相同的段被集中在一起。类别一般有CODE、DATA和STACK等。       
(2) 段寻址伪指令  
格式:ASSUME     段寄存器名:段名,段寄存器名:段名,……
功能:告诉汇编程序,在程序中,哪些段是当前段,它们分别由哪个段寄存器指向
    CPU访问存储器,无论是取指令还是存取某存储单元操作数,都需要使用一个段寄存器。其中取指令操作一定是使用CS,堆栈操作一定是SS,而存取操作数则视选用寻址方式和用作地址指针的寄存器而异。我们知道,由四个段寄存器指向的段是当前段.在任何时刻,只有当前段内的存储单元才可进行访问。在汇编源程序时,汇编程序就必须知道哪些段是当前段.且它们分别由哪个段寄存器指向。只有这样,汇编程序才能对每条指令的目标代码进行确切的汇编。
    由于ASSUME 伪操作只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中(CS、SS除外)。在程序初始化时,装入程序会自动初始化CS和IP,使CS:IP指向END语句所规定的启动地址;如果程序中留有堆栈段,装入程序也会按原程序的要求初始化SS和SP,使SS:SP指向栈顶;将段地址装入DS、ES相应的段寄存器中的工作,必须分别用两条MOV指令完成这一操作。
例3.1.1:程序框架 
STACK SEGMENT PARA STACK 'STACK';堆栈段
    DB 20 DUP('STACK   ')
 STACK ENDS
;********************
DATASG SEGMENT                    ;数据段
; DATA GOES HEAR
 DATASG ENDS
; *********************
EXTRA SEGMENT                     ;附加段(可有可无)             
; DATA GOES HEAR
 EXTRA ENDS
; *********************
CODESG SEGMENT                    ;代码段
; ----------------------
MAIN PROC FAR                      ;主过程
   ASSUME CS:CODESG,DS:DATASG,ES:EXTRA,SS:STACK
   PUSH DS                          ;程序段前缀PSP
   MOV AX,0                         ;首地址入栈
   PUSH AX
   MOV  AX,DATASG                 ;将数据段的段地址传送给
   MOV  DS,AX                      ;段寄存器DS
   MOV  AX,EXTRA                   ;将附加段的段地址传送给
   MOV  ES,AX                       ;段寄存器ES
   ; MAIN PART OF PROGRAM GOES HEAR(程序的主要部分放这里)
   RET                               ;(返回)
MAIN ENDP
;-----------------------
CODESG ENDS
;**************************
END MAIN                         ;程序结束
(3)存储模型与简化段定义伪操作
     对于MAMS 5.0 以后的版本,Microft 公司为段说明引入了一个简化的指令集。对于大多数的MASM 程序,使用简化指令的整个程序外壳减为如下内容:
例3.1.2:
. MODEL  SMALL ;存储模型为SMALL
.STACK 100H   ;堆栈的大小为100H字节,默认为1024字节
.DATA         ;数据定义
……
.CODE
START: 
MOV AX, @DATA  ; DS被初始化为指向数据段
MOV DS, AX
……           ;此处是程序代码
MOV AX,4C00H
INT 21H     
END  START
    存储模型为SMALL表示所有数据放在一个64KB的数据段内, 所有代码放在另一个64KB的代码段内,数据和代码均为近访问。语句.STACK、.DATA、.CODE分别表示堆栈段、数据段、代码段的开始。一个段开始自动结束前面的段。
     虽然不再需要ASSUME语句,但是使用数据段的起始地址来设置DS寄存器的任务仍然需要用户来完成.在简化方式下,MASM定义一个符号名@DATA来指向数据段或用符号名@DGROUP来指向数据段组。
例3.1.3:
. MODEL  SMALL ;存储模型为SMALL
.STACK 100H   ;堆栈的大小为100H字节,默认为1024字节
.CONST         ;数据定义
……
.DATA         ;数据定义
……
.CODE
START: 
MOV AX, @DGROUP  ; DS被初始化为指向数据段组
MOV DS, AX
……           ;此处是程序代码
MOV AX,4C00H
INT 21H     
END  START 
   这样,在访问CONST段和DATA 段中的变量时,都用DS作为段寄存器来防问,以提高运行效率。
3.过程的定义
过程实际上就是一般意义下的子程序。
格式:过程名  PROC [类型]
                    …….
            过程名  ENDP
       其中,类型为:
NEAR —— 段内调用,CS不变,在调用时,只返回地址的偏移地址(即IP入栈)
FAR  —— 段间调用,CS改变,在调用时,返回地址的段地址(即CS和偏移地址IP)都要入栈;(CS)在前,(IP)在后。
4.程序开始和结束伪操作
(1)程序开始的伪指令
 在程序的开始可以用NAME或TITLE 为模块取名字,NAME的格式是;
     NAME  模块名
     汇编程序将以给出的模块名作为模块的名字。如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为:
     TITLE  文本0
     TITLE伪指令是给程序指定一个标题,以便在列表文件中每一页的第二行都显示这个标题文本。文本内容可以由用户任选名字或字符串,但字符个数不得超过60个。
(2)程序结束伪操作
     格式:
      END [标号]
  5.     数据定义及存储器分配语句
格式:[变量名] {DB|DW|DD} 表达式
其中,{  }表示其中的内容必须选用其一
(1) 每个操作数的长度
DB(定义字节)    每个操作数占1个字节
DW(定义字)      每个操作数占2个字节,其低位部分在第一个字节中,高位部分在第二个字节中。
DD(定义双字)    每个操作数占4个字节,低位字后是高位字。
例3.1.4:操作数可以是常数,或者是表达式,如:
DATA_BYTE    DB  10,4,10H
   DATA_WORD    DW  100,100H,一5
     DATA_DW      DD  3*20,0FFFDH
汇编程序可以在汇编期间在存储器中存入数据.如图3.1.1所示。
(2) 定义一个长于两个字符的字符串
  格式:[变量名]  DB  “字符串”
例3.1.5:操作数可以是字符串,如:
MESSAGE    DB  “HELLO”
              DB  “AB”
              DW  “AB”
存储情况.如图3.1.2所示
          
DATA_BYTE
0A
10d      MESSAGE  
43
H
04
4
45
E
10
10h
4C
L
DATA_WORD
64
100d
4C
L
00
4F
O
00
100H
41
A
01
42
B
FB
-5
42
B
FF
41
A
DATA_DW
3C
60d
00
00
00
FD
0FFFDh
FF
00
00
              图3.1.1                 图3.1.2
(3) 定义保留单元数(用问号“?”)
例3.1.6:操作?可以保留存储空间,但不存入数据,如:
ABC   DB  0,?,?,?,0
   DEF   DW ?,52,?
 存储情况.如图4.2.3所示
(4) 定义重复的数值
  格式:[变量名]  {DB|DW|DD} 表达式  DUP (表达式)
DUP前的表达式表示要重复的次数,带圆括号的表达式表示要重复的内容。
例3.1.7
ARRAY1  DB  2 DUP(0,1,2,?)
ARRAY2  DB  100 DUP(?)
 存储情况.如图3.1.4所示
           
(5)定义一个地址表达式
  格式:[变量名]  {DW|DD} 地址表达式
  DW——所定义的地址表达式只包含16位的偏移地址,一般用来定义本段内使用的变量或标号的地址。 
  DD——所定义的地址表达式共占4个字节,第一个字是偏移地址,第二个字是段地址。
例3.1.8:
PARAMETER_TABLE  DW  PAR1
                 DW  PAR2
INTERSEG_DATA    DD  DATA1
                 DD  DATA2
 存储情况.如图4.2.5所示
       
ABC        
00
      ARRAY1  
00
PARAMETER_TABLE
PAR1的偏移地址
 
-
01
 
-
02
PAR2的偏移地址
 
00
-
 
DEF
-
00
  INTERSEG_DATA
DATA1的偏移地址
-
01
 
34
52d
02
DATA1的段地址
 
00
-
 
-
       ARRAY2
-
100个字节
DATA2的偏移地址
 
-
-
 
.
DATA2的段地址
 
.
 
.
 
.
 
 
 
-
 
      图3.1.3               图3.1.4              图3.1.5
(6)同一个地址赋给两个不同类型的变量名
   格式: 变量名   LABEL  类型
  例3.1.9:
   BYTE_ARRAY LABLE BYTE
   WORD_ARRAY DW 50 DUP(?)
     这样在100个字节数组中的第—个字节的地址赋于两个不同类型的变量名;字节类型变量BYTE_ARRAY 和字类型变量WORD—ARRAY。
指令
    MOV  WORD_ARRAY十2,0
把该数组的第3个和第4个字节置0.而
    MOV  BYTE_ARRAY十2,0
则把该数组的第3个字节置0。
           
6. 符号定义语句
(1) 等值语句
  格式: 符号名  EQU 表达式  
  功能:给表达式分配一个符号
例3.1.10:A EQU 7        ;将7赋予符号名 A
    B EQU A-2      ;将A-2的值5赋予符号名 B
    C EQU V+B      ;将V+B的值赋予符号名 C
    COUT EQU CX    ;将COUT 作为寄存器CX的同义名
(2) 等号语句
  格式:符号名  = 表达式  
  功能:除了可以重新赋值外,同EQU
例3.1.11:A = 7        ;正确
    A = 19       ;正确
    A EQU 7      ;正确
    A EQU 19     ;再次定义,错误
7.地址计数器与对准伪操作
(1)地址计数器$
    在汇编程序对源程序汇编的过程中,使用地址计数器来保存当前正在汇编的指令的偏移地址。当开始汇编或在每一段开始时,把地址计数器初始化为零,以后在汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。地址计数器的值可以用美元符号$表示。
(2)定位伪指令   
     格式1:  ORG  表达式
     格式2:  ORG   $十表达式
    功能:强行指定地址计数器(用来记载正在汇编的数据或指令目标代码存放在当前段内的偏移量的部件)的当前值。 
     格式1直接把表达式的值送入地址计数器。格式2将执行ORG 语句当前地址计数器的现行值加上表达式后送入地址计数器。
     ORG 可位于任一数据定义语句或指令语句的前面。
例3.1.12:
ARRAR DW 1,2,$+4,3,4,$+4 
汇编结果为:
      
      ARRAR
01
0074
00
0075
02
0076
00
0077
  0078+4=7C
7C
$=0078
00
0079
03
007A
00
007B
04
007C
00
007D
  007E+4=82
82
$=007E
00
  
(3)  偶地址伪指令
    格式:EVEN
    功能:把位置计数器调整为偶数,使下一字节地址变为偶数。在存储器中,对字单元进行存取时,如是偶地址,那么存取速度较快。   
8. 基数控制伪操作
  格式:.RADIX  表达式
  其中表达式用来表示基数值(用十进制数表示)。
功能:把默认的基数改变为2—16范围内的任何基数。
    说明:汇编程序默认的数为十进制数,因而除非专门指定,汇编程序把程序中出现的数均看作十进制数.DEBUG程序默认的数为十六进制数。为此,当使用其他基数表示的常数时,需要专门给以标记。
例3.1.13:
MOV  BX, 0FFH   与:.RADIX 16
MOV  BX, 178       --MOV BX, OFF
计算机学习热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号