第 3 章 汇编语言程序格式

64
1 3 3 第 第第第第第第第第 第 第第第第第第第第 3.1 第第第第第第 3.2 第第第 3.3 第第第第第第第第 3.4 第第第第第第第第第第第

description

第 3 章 汇编语言程序格式. 3.1 汇编程序功能 3.2 伪操作 3.3 汇编语言程序格式 3.4 汇编语言程序的上机过程. 3.1 汇编程序功能. 计算机是通过执行指令序列来解决问题的。计算机的指令系统就是指该计算机能够执行的全部指令的集合。 指令的一般格式: [ 标号: ] 操作符 OPD , OPS [ ;注释 ] 算术运算和位操作类指令的部分单操作数指令的格式: [ 标号: ] 操作符 OPD [ ;注释 ]. 调试. 调试程序,如 DEBUG.EXE. 错误. 错误. - PowerPoint PPT Presentation

Transcript of 第 3 章 汇编语言程序格式

Page 1: 第 3 章  汇编语言程序格式

1

第第 33 章 汇编语言程序格式章 汇编语言程序格式

3.1 汇编程序功能

3.2 伪操作

3.3 汇编语言程序格式

3.4 汇编语言程序的上机过程

Page 2: 第 3 章  汇编语言程序格式

2

3.1 3.1 汇编程序功能汇编程序功能 计算机是通过执行指令序列来解决问题的。

计算机的指令系统就是指该计算机能够执行的全部指令的集合。

指令的一般格式: [ 标号: ] 操作符 OPD , OPS [ ;注释 ] 算术运算和位操作类指令的部分单操作数指

令的格式: [ 标号: ] 操作符 OPD [ ;注释 ]

Page 3: 第 3 章  汇编语言程序格式

3

汇编语言程序的建立及开发过程汇编语言程序的建立及开发过程

编辑文本编辑器,如 EDIT.COM

源程序:文件名 .asm

汇编汇编程序,如 MASM.EXE

目标模块:文件名 .obj

连接连接程序,如 LINK.EXE

可执行文件:文件名 .exe

调试调试程序,如 DEBUG.EXE

应用程序错误

错误

错误

错误

Page 4: 第 3 章  汇编语言程序格式

4

汇编程序的主要功能汇编程序的主要功能

检查源程序测出源程序中的语法错误,并给出出错

信息产生源程序的目标程序,并可给出列表

文件(同时列出汇编语言和机器语言的文件,称为 LST 文件)

展开宏指令

Page 5: 第 3 章  汇编语言程序格式

5

3.2 3.2 伪操作伪操作硬指令硬指令——使 CPU 产生动作、并在程序运

行期间由计算机执行的语句。伪指令伪指令( Directive )——不产生 CPU 动作、

在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等。

伪指令与具体的处理器类型无关,但与汇编程序的版本有关。

Page 6: 第 3 章  汇编语言程序格式

6

汇编语言语句实例 MOV CX,0 ; 传送指令,具有 2 个操作数 DELAY: NOP

; 空操作指令,没有操作数,带有标号 LOOP DELAY ; 循环指令,标号 DELAY 说明转移位置

BUFFER DB 1,2,3,4,5,6,7 ; 数据定义伪指令,在主存中开辟 7 个连续的字节单元,初值依次为 1 ~ 7 , BUFFER 表示首地址

Page 7: 第 3 章  汇编语言程序格式

7

3.2.1 3.2.1 段定义伪操作段定义伪操作1. 完整的段定义伪操作 存储器的物理地址是由段地址和偏移地址组合而成的,

汇编程序在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。为此需要用段定义伪操作,格式如下:

段名 SEGMENT [ 定位 ] [ 组合 ] [ 使用 ] [' 类别 ' ]... ; 对数据段 , 附加段和堆栈段 , 一般是存储单元

的定    ...   ; 义 , 分配等伪操作,对代码段则是指令及伪操作. 段名 ENDS

Page 8: 第 3 章  汇编语言程序格式

8

完整段定义由 SEGMENT 和 ENDS 这一对伪指令实现, SEGMENT 伪指令定义一个逻辑段的开始, ENDS 伪指令表示一个段的结束

段定义指令后的 4 个关键字用于确定段的各种属性,堆栈段要采用 stack 组合类型,代码段应具有‘ code’ 类别,其他为可选属性参数

如果不指定,则采用默认参数;但如果指定,注意要按照上列次序。

Page 9: 第 3 章  汇编语言程序格式

9

(1) 定位类型:指定逻辑段在主存储器中的边界,可为:

BYTE 该段可以从任何地址开始,这样偏移地址可能不是 0

WORD 该段必须从字的边界开始,即段起始地址必须为偶数

DWORD 该段必须从双字的边界开始,即段起始地址的最低两个十六进制数位必须为 4 的倍数

PARA 该段的起始地址必须从小段边界开始,即段起始地址的最低 16进制数必须为 0

Page 10: 第 3 章  汇编语言程序格式

10

PAGE 该段必须从页的边界开始,即段的起始地址的最低两个十六进制数位必须为 0

简化段定义伪指令的代码和数据段默认采用WORD 定位,堆栈段默认采用 PARA 定位

完整段定义伪指令的默认定位属性是 PARA ,其低 4 位已经是 0 ,所以默认情况下数据段的偏移地址从 0 开始

Page 11: 第 3 章  汇编语言程序格式

11

(2) 组合类型说明程序连接时的段合并方法,即指定多个逻辑段之间的关系,可为:

PRIVATE 本段为私有段,与其他段没有逻辑关系,在连接时不与其他段合并,每段都有自己的段地址。这是完整段定义伪指令默认的段组合方式

PUBLIC 连接程序把本段与所有同名同类型的其他段相邻地连接在一起,然后为所有这些段指定一个共同的段地址,也就是合成一个物理段。这是简化段定义伪指令默认的段组合

STACK 本段是堆栈的一部分,连接程序将所有 STACK 段按照与 PUBLIC 段的同样方式进行合并。这是堆栈段必须具有的段组合

Page 12: 第 3 章  汇编语言程序格式

12

(3) 使用类型是支持 32 位段而设置的属性,用来说明使用 16 位寻址方式还是 32 位寻址方式

对于 16 位 x86 CPU 来说,它默认是 16 位段,即 USE16

而对于汇编 32 位 x86 CPU 指令时,它默认采用 32 位段,即 USE32 ;但可以使用 USE16 指定标准的 16 位段

编写运行于实地址方式( 8086工作方式)的汇编语言程序,必须采用 16 位段

Page 13: 第 3 章  汇编语言程序格式

13

(4) 类别在引号中给出连接时组成段组的类型名。当连接程序组织段时,并不能把相同类别的段合并起来,但可将所有的同类别段相邻分配

段类别可以是任意名称,但必须位于单引号中

大多数 MASM 程序使用 'code' 、 'data' 和 'stack’ 来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续

Page 14: 第 3 章  汇编语言程序格式

14

此外,必须明确段与段寄存器的关系,可用 ASSUME 伪操作来实现。格式:

ASSUME 段寄存器:段名 [, 段寄存器名:段名 , ...]

作用 : 通知MASM 用指定的段寄存器来寻址对应的

逻辑段,即建立段寄存器与段的缺省关系 在明确了程序中各段与段寄存器之间的关系后,

汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是 ASSUME 伪指令的主要功能。

Page 15: 第 3 章  汇编语言程序格式

15

ASSUME 伪指令并不为段寄存器设定初值,所以在代码段中还必须把段地址装入相应的段寄存器中。例如:定义数据段段名为 DATA ,则需使用 MOV 指令对 DS 段寄存器进行赋值。

MOV AX, DATA

MOV DS, AX

如果程序中有堆栈段,也需要把地址装入 SS中

代码段不需要这样做,代码段的这一操作是在程序初始化时完成的。

Page 16: 第 3 章  汇编语言程序格式

16

例:完整的段定义伪操作

data_1 segment…data_1 endsdata_2 segment…data_2 endscode segment assume cs:code,ds:data_1,es:data_2start: mov ax,data_1 mov ds,ax mov ax,data_2 mov es,ax…code ends end start

Page 17: 第 3 章  汇编语言程序格式

17

2. 存储模型与简化段定义伪操作(1)MODEL 伪操作 格式: .MODEL memory_model[,model options] 用来表明存储模型,即用来说明在存储器中是如何安放各个段的.

存储模型 memory model 决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性

MASM 有 7 种不同的存储模式: ① TINY   ② SMALL ③ COMPACT   ④ MEDIUM ⑤ LARGE   ⑥ HUGE ⑦ FLAT

Page 18: 第 3 章  汇编语言程序格式

18

T iny  微型模型是 MASM 6.0才引入的,用于创建 COM 类型程序。

   用微型模型编写汇编语言程序时,所有的段地址寄存器都被设置为同一值,这意味着代码段、数据段、堆栈段都在同一个段内,不大于 64KB ;访问操作数或指令都只需要使用 16 位偏移地址。一般用于小程序。

S mall 小型模型是最常用的一种模型。在小型模型下,一个程序至多只能有一个代码段和一个数据段,每段不大于 64KB 。

   这里的数据段指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不超过 64KB ;访问操作数或指令都只需要使用 16 位偏移地址;代码和数据都是近访问的,小模型下程序的最大长度为 128KB

Page 19: 第 3 章  汇编语言程序格式

19

C ompact 紧凑模型适合于数据量大但代码量小的程序。在该模型下,代码段被限制在一个不大于 64KB 的段内;而数据段则可以有多个,超过 64KB 。 代码是近访问的,而数据则可为远访问的。

M edium 中型模型是与紧凑模型互补的模型,适合于数据量小但代码量大的程序。中型模式的代码段可以超过 64KB ,有多个;但数据段只能有一个不大于 64KB 的段。数据是近访问,而代码可远访问。

L arge 大型模式允许的代码段和数据段都有多个,都可以超过 64KB ;但全部的静态数据(不能改变的数据)仍限制在 64K字节内 .数据和代码都可以远访问。

Page 20: 第 3 章  汇编语言程序格式

20

H uge 巨型模型与大型模型基本相同,只是静态数据不再被限制在 64K 字节之内。

F lat 平展模型用于创建一个 32 位的程序,它只能运行在 32 位 x86 CPU上。 DOS 下不能使用 FLAT 模型,而编写 32 位 Windows 9.x或Windows-NT 的程序时,必须采用 FLAT 模型。

DOS 下编程可选择前六种模型,一般可以选用SMALL 模型, TINY 模式产生 COM 程序,其他模型产生 EXE 程序, FLAT 模型只能用于 32 位程序。

Page 21: 第 3 章  汇编语言程序格式

21

Model options允许用户指定三种选项:高级语言接口、操作系统和堆栈距离。

   高级语言接口选项是指该汇编语言程序作为某一种高级语言程序的过程而为该高级语言程序调用时,应该用C等来说明。

   操作系统选项是要说明程序运行于哪个操作系统之下,可用 OS_DOS或 OS_OS2 来说明,默认是 OS_DOS 。

   堆栈距离选项可用 NEARSTACK或 FARSTACK 来说明,基中 NEARSTACK 是指堆栈段和数据段组合到一个 DGROUP 段中,而 FARSTACK是指堆栈段和数据段并不合并。

  例如: .MODEL SMALL,C .MODEL LARGE,OS_DOS

Page 22: 第 3 章  汇编语言程序格式

22

(2)简化的段定义伪操作   简化段定义伪指令指明一个逻辑段的开始,

同时自动结束前面的一个段。采用简化段定义伪指令前,需有 .model 语句。常用:

    .STACK [大小 ] ;堆栈段开始    .DATA ;数据段开始    .CODE [ 段名 ] ;代码段开始

.STACK [大小 ]

   堆栈段伪指令 .STACK创建一个堆栈段,段名是: stack ,它的参数指定堆栈段所占存储区的字节数,默认是 1KB ( = 1024 = 400h 字节)

Page 23: 第 3 章  汇编语言程序格式

23

.DATA  数据段伪指令 .data创建一个数据段,段名是: _DATA 。它用于定义具有初值的变量,当然也允许定义无初值的变量。 无初值变量可以安排在另一个段中,它用 .data?伪指令创建,数据段名是: _BSS 。 .const 伪指令用于建立只读的常量数据段(段名: CONST ).CODE [ 段名 ]  代码段伪指令 .code创建一个代码段,它的参数指定该代码段的段名。如果没有给出段名,则采用默认段名:

   在 TINY 、 SMALL 、 COMPACT 和 FLAT 模式下,默认的代码段名是: _TEXT ;

   在 MEDIUM 、 LARGE 和 HUGE 模式下,默认的代码段名是:模块名 _TEXT 。

Page 24: 第 3 章  汇编语言程序格式

24

(3)与简化段定义有关的预定义符号   使用简化段定义,各段名称和其他用户所

需的信息可以使用 MASM预定义符号,例如:   @data 表示由 .data 等定义的数据段的段

名。(4) 简化段定义举例   .MODEL SMALL .STACK 100H .DATA … .CODESTART:MOV AX,@DATA

MOV DS,AX

MOV AX,4C00H

INT 21H

END START

Page 25: 第 3 章  汇编语言程序格式

25

3. 段组定义伪操作 格式:组名 GROUP 段名 [, 段名 ,...] 把多个同类段合并为一个 64KB 物理段,并用一

个组名统一存取它 定义段组后,段组内各段就统一为一个段地址,

各段定义的变量和标号的偏移地址就相对于段组基地址计算

offset 操作符取变量和标号相对于段组的偏移地址,如果没有段组则取得相对于段的偏移地址。offset 后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址

Page 26: 第 3 章  汇编语言程序格式

26

3.2.2 3.2.2 程序开始和结束伪操作程序开始和结束伪操作 程序开始可用 Name 和T ITLE 作为模块的名字。  NAME 的格式: NAME 模块名   汇编语言将以给出的”模块名”作为模块的名字。  TITLE 的格式: TITLE 标题    TITLE 伪操作可指定列表文件中的每一页上打印

的标题 END 表源程序结束的伪操作,格式为: END [ 标号 ]   用来指示汇编程序 MASM到此结束汇编过程。

源程序的最后必须有一条 END 语句。可选的标号用于指定程序开始执行点,连接程序将据此设置 CS : IP 值

Page 27: 第 3 章  汇编语言程序格式

27

MASM6.0还增加了定义程序入口点和出口点的伪操作。用 .STARTUP 定义程序的初始入口点,并产生设置 DS,SS 和 SP 的代码。如果程序采用了 .startup 伪指令就不需要再用“ end 标号”指明开始执行点,但还要有 end 伪指令

.EXIT 用来产生退出程序并返回操作系统的代码,其格式: .EXIT [返回参数 ]

   可选参数是一个返回的数码,通常用 0 表示没有错误。例如 .exit 0 对应的代码是:   MOV AX,4C00H INT 21H

DOS 功能调用的 4CH子功能(返回 DOS ): 入口参数: AH= 4CH , AL=返回数码

Page 28: 第 3 章  汇编语言程序格式

28

3.3 3.3 参数、变量和标号参数、变量和标号

本节详细讨论汇编语言程序语句的主要部分:

参数 变量名 标号并引出相关的伪指令和操作符本节重点掌握:

– 常数的表达– 变量定义伪指令 DB/DW/DD 、– 地址操作符和类型操作符

Page 29: 第 3 章  汇编语言程序格式

29

3.3.1 3.3.1 数值型参数数值型参数 在源程序语句格式的 4 个组成部分中,参数

是指令的操作对象(在学习硬指令时被称为操作数),参数之间用逗号分隔

参数根据指令不同可以没有,可以有 1 个、2 个或多个

汇编语言程序中,指令参数有数值型,它的主要形式是常数和数值表达式;

硬指令的操作数有立即数;立即数就要用数值型参数表达

Page 30: 第 3 章  汇编语言程序格式

30

1. 1. 常数常数常数(常量)表示一个固定的数值它又分成多种形式:

( 1 )十进制常数( 2 )十六进制常数( 3 )二进制常数( 4 )八进制常数( 5 )字符串常数( 6 )符号常数

Page 31: 第 3 章  汇编语言程序格式

38

2. 2. 数值表达式数值表达式 数值表达式一般是指由运算符连接的各种常数所构成的表达式

汇编程序在汇编过程中计算表达式,最终得到一个数值

程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性

MASM 对除伪指令外各种汇编时处理的指令统称为操作符( Operator )

Page 32: 第 3 章  汇编语言程序格式

39

运算符运算符 算术运算符

+ - * / MOD 逻辑运算符

AND OR XOR NOT 移位运算符

SHL SHR 关系运算符

EQ NE GT LT GE LE高低分离符

HIGH LOW HIGHWORD LOWWORD

Page 33: 第 3 章  汇编语言程序格式

45

3. 3. 运算符的优先级运算符的优先级1 () <> [] · LENGTH SIZE WIDTH MASK

2 PTR OFFSET SEG TPYE THIS :

3 HIGE LOW

4 * / MOD SHL SHR

5 + -

6 EQ NE GT LT GE LE

7 NOT

8 AND

9 OR XOR

10 SHORT

建议采用圆括号“()”显式表达,它可以极大地提高程序的可阅读性

Page 34: 第 3 章  汇编语言程序格式

46

4.4. 地址型参数地址型参数 汇编语言程序中,指令参数还有地址型,它

的主要形式是标号和名字(变量名、段名、过程名等)

硬指令的操作数有存储单元;存储单元就应该用地址型参数(存储器操作数)表达

Page 35: 第 3 章  汇编语言程序格式

47

3.3.2 3.3.2 变量定义伪指令变量定义伪指令变量定义( Define )伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化变量名 伪指令助记符 初值表

变量定义伪指令最常使用

Page 36: 第 3 章  汇编语言程序格式

48

变量名变量名 变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用这个符号表示地址,常称为符号地址

变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址

设置变量名是为了方便存取它指示的存储单元

Page 37: 第 3 章  汇编语言程序格式

49

初值表初值表初值表是用逗号分隔的参数主要由数值常数、表达式或?、 DUP 组

成?——表示初值不确定,即未赋初值;DUP—— 表示重复初值DUP 的格式为:重复次数 DUP(重复初值参数 )

Page 38: 第 3 章  汇编语言程序格式

50

变量定义伪指令助记符变量定义伪指令助记符 变量定义伪指令根据申请的主存空间单位分类 DB—— 定义字节伪指令 DW—— 定义字伪指令 DD—— 定义双字伪指令 DF—— 定义 3 字伪指令 DQ—— 定义 4 字伪指令 DT—— 定义 10 字节伪指令还有定位伪指令

Page 39: 第 3 章  汇编语言程序格式

51

定义字节单元伪指令定义字节单元伪指令 DBDBDB 伪指令用于分配一个或多个字节单元,并

可以将它们初始化为指定值初值表中每个数据一定是字节量( Byte ),存

放一个 8 位数据: 可以是 0~255 的无符号数 或是- 128 ~+ 127 带符号数 也可以是字符串常数

Page 40: 第 3 章  汇编语言程序格式

52

data segment ;数据段X db 'a',-5

db 2 dup(100),?Y db 'ABC'data ends

字节单元定义实例字节单元定义实例mov al,X ; 此处 X 表示它的第 1 个数据, 故 AL←'a'inc X+1 ; 对 X 为始的第 2 个数据减 1 , 故成为 -4mov Y,al ; 现在 Y 这个字符串成为 'aBC'

字节变量的应用字节变量的应用

Page 41: 第 3 章  汇编语言程序格式

53

定义字单元伪指令定义字单元伪指令 DWDWDW 伪指令用于分配一个或多个字单元,

并可以将它们初始化为指定值初值表中每个数据一定是字量( Word ),

一个字单元可用于存放任何 16 位数据: 一个段地址一个偏移地址 两个字符 0 ~ 65535之间的无符号数 - 32768 ~+ 32767之间的带符号数

Page 42: 第 3 章  汇编语言程序格式

54

data segment ;数据段count dw 8000h,?,'AB'maxint equ 64hnumberdw maxintarray dw maxint dup(0)data ends

字单元定义实例字单元定义实例

Page 43: 第 3 章  汇编语言程序格式

55

字变量和字常量的定义:WNUM EQU 5678H ; 定义WNUM 为常量COUNT DW 20H; 定义 COUNT 变量,假设在数据段的偏移地址为 10H字变量和字常量的应用:MOV AX,[BX+SI+WNUM] ; MOV AX,[BX+SI+5678H]MOV AX,COUNT ; MOV AX,[0010H]MOV AX,[SI+COUNT] ; MOV AX,COUNT[SI]

; MOV AX,[SI+10H]LEA BX,COUNT ; LEA BX,[0010H]MOV BX,OFFSET COUNT ; MOV BX,0010H

字变量和字常量字变量和字常量

Page 44: 第 3 章  汇编语言程序格式

56

定义双字单元伪指令定义双字单元伪指令 DDDDDD 伪指令用于分配一个或多个双字单元,并

可以将它们初始化为指定值初值表中每个数据是一个 32 位的双字量( Do

uble Word ): 可以是有符号或无符号的 32 位整数 也可以用来表达 16 位段地址(高位字)和 16 位

的偏移地址(低位字)的远指针

vardd DD 0,?,12345678hfarpoint DD 00400078h

Page 45: 第 3 章  汇编语言程序格式

57

其他数据单元定义伪指令其他数据单元定义伪指令定义 3 字伪指令 DF—— 用于为一个或多个

6 字节变量分配空间及初始化6 字节常用在 32 位 CPU 中表示一个 48位远指针

( 16 位段选择器 :32 位偏移地址)定义 4 字伪指令 DQ—— 用于为一个或多个

8字节变量分配空间及初始化8字节变量可以表达一个 64 位整数

定义 10 字节伪指令 DT—— 用于为一个或多个 10 字节变量分配空间及初始化

10 字节变量可以表达扩展精度浮点数

Page 46: 第 3 章  汇编语言程序格式

58

例例 :: 数据定义综合应用数据定义综合应用

.model small

.stack

.databvar DB 16wvar DW 4*3dvar DD 4294967295 ;= 232- 1qvar DQ ? DB 1,2,3,4,5tvar DT 2345 ; 定义了 BCD 码 2345Habc DB 'a','b','c'msg DB 'Hello',13,10,'$'bbuf DB 12 DUP('month')dbuf DD 25 DUP(?)CALLDOS EQU <int 21h>

.code

.startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2]

;取双字到 DX.AX mov dx,offset msg mov ah,09h CALLDOS.exit 0end

Page 47: 第 3 章  汇编语言程序格式

59

定位伪指令定位伪指令定位伪指令控制数据的偏移地址ORG 参数ORG 伪指令是将当前偏移地址指针指向参

数表达的偏移地址:ORG 100h ;从 100h处安排数据或程序ORG $+10; 使偏移地址加 10 ,即跳过 10 个字节空间MASM 中,符号“$”表示当前偏移地址

值EVEN ;从偶地址开始ALIGN n ;从n的整数倍地址开始

Page 48: 第 3 章  汇编语言程序格式

60

3.3.3 3.3.3 变量和标号的属性变量和标号的属性 标号和名字一经定义便具有以下两类三种属性:① 段值

标号和名字对应存储单元的段地址② 偏移值

标号和名字对应存储单元的偏移地址③ 类型

标号、子程序名的类型可以是 NEAR (近)和 FAR (远),分别表示段内或段间

变量名的类型可以是 BYTE (字节)、 WORD(字)和 DWORD (双字)等

地址属性

类型属性

Page 49: 第 3 章  汇编语言程序格式

61

地址操作符地址操作符取得名字或标号的段地址和偏移地

址两个属性[ ] 将括起的表达式作为存储器地址$ 当前偏移地址: 采用指定的段地址寄存器OFFSET 名字 /标号返回名字或标号的偏移地址SEG 名字 /标号返回名字或标号的段地址

Page 50: 第 3 章  汇编语言程序格式

62

org $+10array db 45,45h

.codemov ax,seg arraymov ds,axmov bx,offset array; 等价于 lea bx,arraymov cl,array+4; 等效于 mov cl,array[4]mov ax,es:[2000h]

地址操作符实例地址操作符实例

Page 51: 第 3 章  汇编语言程序格式

63

类型操作符类型操作符类型操作符对名字或标号的类型属性进行

有关设置

类型名 PTR 名字 / 标号THIS 类型名SHORT 标号TYPE 名字 / 标号SIZEOF 变量名LENGTHOF 变量名

Page 52: 第 3 章  汇编语言程序格式

64

类型名 PTR 名字 / 标号

PTR 操作符使名字或标号具有指定的类型类型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE或者是 NEAR/FAR ,还可以是由 STRUCT 、 REC

ORD 、 UNION 以及 TYPEDEF 定义的类型mov al,byte ptr w_var ;w_var是一个字变量jmp far ptr n_label ;n_label是一个标号使用 PTR 操作符,可以临时改变名字或标号的

类型

Page 53: 第 3 章  汇编语言程序格式

65

THIS 类型名利用 THIS 说明的操作数具有汇编时的当前逻辑地

址,但具有指定的类型b_var equ THIS byte;按字节访问变量 b_var,但与w_var的地址相同w_var dw 10 dup(0) ;按字访问变量w_varf_jump equ THIS far; 用 f_jump为段间转移( f_jump label far)n_jump: mov ax,w_var; 用 n_jump为段内近转移,但两者指向同一条指令LABEL 伪指令的功能等同于“ EQU THIS”

Page 54: 第 3 章  汇编语言程序格式

66

SHORT 标名

指定标号作为 -128~ +127 字节范围内的短转移jmp short n_jump当然,如果标号实际上超出了这

个范围,则出错。

Page 55: 第 3 章  汇编语言程序格式

67

TYPE 名字 / 标名返回表明名字或标号类型的一个字量数值对字节、字和双字变量依次返回 1 、 2 和 4 ;对短、近和远转移依次返回 ff01h 、 ff02h 和 ff05h

mov ax,TYPE w_var ; 汇编结果为mov ax,2mov ax,TYPE n_jump; 汇编结果为 mov ax,0ff02h( near标号)操作符 SIZEOF返回整个变量占用的字节数LENGTHOF返回整个变量的数据项数(即元素数)

SIZEOF = LENGTHOF × TYPE

Page 56: 第 3 章  汇编语言程序格式

68

.model small

.stack

.datav_byte equ this byte ;v_byte 是字节类型,与变量 v_word 的地址相同v_word dw 3332h,3735h

;v_word 是字类型的变量target dw 5 dup(20h)

; 分配数据空间 2×5= 10 字节crlf db 0dh,0ah,'$'flag db 0n_point dw offset s_label

;取得标号 s_label的偏移地址

例:属性及其应用例:属性及其应用

Page 57: 第 3 章  汇编语言程序格式

69

.code

.startup mov al,byte ptr v_word ; 用 PTR改变 v_word 的类型,否则类型不匹配 dec al mov v_byte,al ; 对 v_word 的头一个字节操作,原为 32H、现为 31Hn_label: cmp flag,1 jz s_label ;flag单元为 1 转移 inc flag jmp short n_label ;进行短转移

Page 58: 第 3 章  汇编语言程序格式

70

s_label: cmp flag,2jz next ;flag单元为 2 转移inc flagjmp n_point

; 段内的存储器间接寻址,转移到 s_label标号处next: mov ax,type v_word

; 汇编结果为mov ax,2mov cx,lengthof target ; 汇编结果为mov cx,5

Page 59: 第 3 章  汇编语言程序格式

71

mov si,offset targetw_again: mov [si],ax ; 对字单元操作

inc si ;SI指针加 2inc siloop w_again ; 循环mov cx,sizeof target; 汇编结果为 mov cx,0ahmov al,'?'mov di,offset target

b_again: mov [di],al ; 对字节单元操作inc di ;DI指针加 1loop b_again ; 循环

Page 60: 第 3 章  汇编语言程序格式

72

mov dx,offset v_word ;显示结果: 1357??????????mov ah,9int 21h.exit 0end

Page 61: 第 3 章  汇编语言程序格式

73

3.4.1 建立汇编语言的工作环境 (1) 编辑程序,如 EDIT.EXE (2) 汇编程序,如 MASM.EXE   (3) 连接程序,如 LINK.EXE  (4)调试程序,如 DEBUG.COM3.4.2 建立 ASM 文件   可以用编辑程序 EDIT.EXE 在磁盘上建立汇

编语言源程序.3.4.3 用 MASM 程序产生 OBJ 文件 源文件建立后,要用汇编程序对源文件汇编,

汇编后产生二进制的目标文件 (.OBJ 文件 ) .

3.4 3.4 汇编语言程序的上机过程汇编语言程序的上机过程

Page 62: 第 3 章  汇编语言程序格式

74

  汇编程序的输入文件是 ASM 文件,其输出文件可以有三个:

  第一个是 OBJ 文件,这是汇编的主要目的.  第二个是 LIST 文件,称为列表文件.这个文件

同时列出源程序和机器语言程序清单,并给出符号表,可使程序调试更加方便.这个文件是可有可无的.

  第三个是 CRF 文件,这个文件用来产生交叉引用表 REF .一般程序不需要建立此文件.为了建立交叉引用表,必须调用 CREF 程序.交叉引用表给出了用户定义的所有符号,对于每个符号列出了其定义所在行号及引用的行号.

  汇编程序另一个重要功能:可以给出源程序中的错误信息.

Page 63: 第 3 章  汇编语言程序格式

75

3.4.4 用 LINK 程序产生 EXE 文件 产生二进制的目标文件 (OBJ 文件 ) 后,还必

须使用连接程序 (LINK) 把 OBJ 文件转换为可执行的 EXE 文件.

   LINK 程序有两个输入文件 OBJ 和 LIB , OBJ 是需要连接的目标文件, LIB 则是程序中需要用到的库文件. LINK 有两个输出文件,一个是EXE 文件,这是需要的可执行文件,另一个为MAP 文件,它是连接程序的列表文件,它给出每个段在存储器中的分配情况.

3.4.5 程序的执行  在建立了 EXE 文件后,可以直接从 DOS 执行

程序.

Page 64: 第 3 章  汇编语言程序格式

76

总  结总  结  详述汇编语言程序格式的组成部分

简单介绍了汇编程序的功能重点介绍了各伪操作指令介绍汇编语言程序的上机过程