第 4 章 汇编语言程序格式

59
1/59 第4第 第第第第第第第第 4.1 第第第第第第 第第第第第第第第第第第 第第第第第第第 第第 第第第第第第第第第第第第第第第第 第第第第第第第第第第第第第第第第第 第第第第第 第第第第第

Upload: kamala

Post on 27-Jan-2016

130 views

Category:

Documents


0 download

DESCRIPTION

第 4 章 汇编语言程序格式. 4.1 汇编程序功能 ⒈汇编语言程序的开发过程 ⒉ 汇编程序 属于系统软件 ⒊汇编语言源程序的基本组成单位: 语句 ⒋汇编语言源程序中的三种语句: 指令语句 伪指令语句 宏指令语句. 汇编程序 如 MASM. 连接程序 如 LINK. 汇编语言源程序 .ASM. 可执行程序 .EXE. 目标程序 .OBJ. 调试程序 如 DEBUG. 调试和运行程序. 汇编语言程序的开发过程. 2. 汇编程序的主要功能 检查源程序,给出出错信息。 产生目标文件 ( .obj ) 和列表文件 ( .lst ) 。 - PowerPoint PPT Presentation

TRANSCRIPT

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

1/59

第 4章 汇编语言程序格式

4.1 汇编程序功能⒈汇编语言程序的开发过程⒉汇编程序属于系统软件⒊汇编语言源程序的基本组成单位:语句⒋汇编语言源程序中的三种语句:• 指令语句• 伪指令语句• 宏指令语句

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

2/59

汇编语言程序的开发过程

汇编程序如 MASM汇编语言源程序

.ASM目标程序

.OBJ

连接程序如 LINK 可执行程序

.EXE

调试和运行程序

调试程序如 DEBUG

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

3/59

• 2. 汇编程序的主要功能• 检查源程序,给出出错信息。• 产生目标文件 (.obj) 和列表文件 (.lst) 。• 展开宏指令。

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

4/59

4.2 伪操作

伪操作:又称为伪指令是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。

伪操作的种类有如下几种:• 处理器选择伪操作• 段定义伪操作• 程序开始和结束伪操作• 数据定义及存储器分配伪操作• 表达式赋值伪操作• 地址计数器与对准伪操作• 基数控制伪操作

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

5/59

4.2.1 处理器选择伪操作由于 80X86 的所有处理器都支持 8086/8088 指令系统,但每一种

高档的机器的机型又都增加一些新的指令,因此在编写程序的时候要告诉汇编程序应该选择哪一种指令系统。

.8086 选择 8086 指令系统

.286 选择 80286 指令系统

.286P 选择保护模式下的 80286 指令系统

.386 选择 80386 指令系统

.386P 选择保护模式下的 80386 指令系统

.486 选择 80486 指令系统

.486P 选择保护模式下的 80486 指令系统

.586 选择 Pentium 指令系统

.586P 选择保护模式下的 Pentium 指令系统• 这类伪操作一般放在整个程序的最前面。如不给出,则汇编

程序认为其默认值为 .8086 ,使用时在类型前加一“ .”号。

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

6/59

4.2.2 段定义伪操作

格式:段名 SEGMENT [ 定位类型 , 组合类型 , 使用类型 , 类别 ] …… 段名 ENDS

2.ASSUME 伪操作:指明段和段寄存器之间的关系。

1. 段定义伪操作:把标号和变量(代码段和数据段的符号地址)的偏移地址通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。

格式: ASSUME 段寄存器:段名,……,段寄存器:段名

ASSUME NOTHING: 可取消前面由 ASSUME 所指定的段寄存器

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

7/59

例 4.1data segment ; 定义数据段 …data ends;----------------------------------------extra segment ; 定义附加段 …extra ends;----------------------------------------code segment ; 定义代码段 assume cs:code, ds:data, es:extrastart: mov ax, data mov ds, ax ; 段地址 段寄存器 …code ends end start

PSPDS

ES

SS

CS

EXE 程序的内存映象图

装入模

文件

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

8/59

( 1)定位类型 (align_type)功能:说明段的起始地址应有怎样的边界值。 BYTE :该段可以从任意地址开始,起始偏移地址可能不是 0

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

十六进制数位必须为 4的倍数。 PARA :指定段的起始地址必须从小段边界开始,即段起始地

址的最低的 16进制数位必须为 0。偏移地址可从 0开始 PAGE :该段必须从页的边界开始,段起始地址的最低两个 16

进制数位必须为 0(该地址能被 256 整除)。 定位类型的默认项为 PARA 。

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

9/59

( 2)组合类型 (combine_type)

功能 : 说明程序连接时的段合并方法。 PRIVATE : (私有段),连接时不与其他模块中的同名

分段合并(默认的组合类型) PUBIC:可把不同模块中的同名段相连接形成一个段,连接次序由命令决定。 COMMON :可把不同模块中的同名段重叠而形成一个段,由于各同名分段有相同的起始地址,所以产生覆盖。连接的长度为各分段的最大长度。

MEMORY :与 PUBIC同义。 STACK :把不同模块中的同名段组合而形成一个堆栈段,段长为各段长度的总和。

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

10/59

( 3)使用类型 (use_type)

功能:说明使用 16位寻址方式还是 32位寻址方式

类型 寻址方式 段长 段地址 偏移地址

USE16 16 位 不超过 64KB 16 位 16 位

USE32 32 位 可达到 4GB 16 位 32 位

( 4)类别(‘ class’):在引号中给出连接时组成段组的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。

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

11/59

• 2. 存储模型与简化段定义伪操作

1) MODEL 伪操作: 格式: . MODEL 存储模型 [ ,模型属性 ]

七种存储模型: TINY 、 SMALL 、 MEDIUM 、 COMPACT 、 LARGE 、

HUG 、 FLAT

三种模型属性选项:高级语言接口选项

操作系统选项

堆栈距离选项: NEARSTACK 、 FARSTACK

2 )简化的段定义伪操作:参考书 122页

3 )段组定义伪操作: 格式:段组名 GROUP 段名 [,段名 ]

汇编语言自动的把各数据段组成一个段组 DGROUP ,以便程序在访问各数据段时使用一个数据段寄存器( DS)。

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

12/59

4.2.3 程序开始和结束伪操作1 ) NAME 伪操作格式: NAME 模块名 功能:定义模块名2) TITLE 伪操作格式: TITLE TEXT 功能: TITLE 可指定列表文件的每一页的标题。 若无 NAME 伪操作,则汇编语言用 TEXT 中的前六个字符作为模块名。 若既无 NAME 伪操作又无 TITLE 伪操作,则用源文件名作为模块名。3) END 伪操作格式: END [ 程序首地址标号 ]

功能:表示源程序结束

如果多个程序模块相连接,则只有主程序要使用标号,其它子模块则只用END 不用标号。

4) STARTUP 伪操作格式: STARTUP 功能:用来定义程序的初始入口点,并且产生设置 DS , SS 和 SP 的代码。

如果程序中使用了 .startup, 则 END 伪操作中不必再指定程序的入口点标号。

5) EXIT 伪操作格式: EXIT [ return_value ] 功能:用来产生退出程序并返回操作系统的代码。

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

13/59

4.2.4 数据定义及存储器分配伪操作格式: [变量 ] 助记符 操作数 [,操作数 ,…] [; 注释 ]变量:用符号地址表示(与指令语句前的标号作用相同),它可有可无。

注释:字段用来说明该伪操作的功能,它也是可有可无的。

助记符: DB DW DD DF DQ DT 这些助记符可把跟在其后的数据存入指定的存储单元中,形成初

始化数据;或者只分配存储空间而并不存入确定的数据,形成未初始化数据。 DW 和 DD 伪操作还可存储地址, DF伪操作则可存储由 16位段地址及 32位偏移地址组成的远地址指针。

DB :定义字节,其后的每个操作数都占有一个字节。 DW :定义字,其后的每个操作数都占有一个字,存储偏移地址 DD :定义双字,其后的每个操作数都占有两个字,存储整个地址( 1

6偏移地址 +16 段地址) DF:定义 6个字节的字,每个操作数都占有 48位,存放远地址。 DQ:定义 4个字,每个操作数都占有 4个字,存放双精度浮点数。 DT :定义 10 个字节,其后的每个操作数都占有 10 个字节,形成压缩的 BCD 码。存储整个地址( 32偏移地址 +16 段地址)

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

14/59

数据定义伪指令数据定义伪指令中的表达式的四种形式 :

①数值表达式

②字符表达式

③?表达式

④带 DUP 表达式

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

15/59

数据定义伪指令中的表达式是数值表达式

• 例 4.7操作数可以是常数,或者是表达式

DATA_BYTE DB 10,4,10H,?DATA_WORD DW 100,100H,-5,?DATA_DW DD 3*20,0FFFDH

00

0AH 04H 10H

-

64H

00H 00H 01H FBH

FFH

3c

DATA_BYTE

DATA_WORD

FD

00

00

FF

00

00

DATA_DW

60d

0FFFDH

100d

100h

-5

10d410h?

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

16/59

数据定义伪指令中的表达式是数值表达式

①数值表达式

DATA1 SEGMENTVAR1 DB 10 , 10HVAR2 DW 1234HVAR3 DD 12345678HDATA1 ENDS

VAR1

ARY[0]

00000H

FFFFFH

主存

VAR2

ARY[0] 双字

VAR3

字节10H34H

12H

78H56H

34H

12H

0AH

偏移地址

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

17/59

数据定义伪指令中的表达式是字符表达式

例 4.8 操作数是字符串ARRAY DB ‘HELLO’ DB ‘AB’ DW ‘AB’

48H

45H

4CH

4CH

4FH

41H

42H

42H

41H

ARRAY HELLOABBA

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

18/59

数据定义伪指令中的表达式是字符表达式

DATA2 SEGMENT

STRING1 DB’AB’

STRING2 DW ’AB’

STRING3 DD’AB’

DATA2 ENDS

STRING1

ARY[0]

… 00000H

FFFFFH

主存

STRING2

ARY[0]

ARY[0]

双字

STRING3

字节42H42H

41H

42H41H

00H

00H…

41H

存储器分配示意图

偏移地址

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

19/59

数据定义伪指令注意1 、在 DB 伪指令中,字符串的每一个字符分配一个字节单元并以 ASCII 码形式存放,字符串从左到右依次存放。其长度不超过 255 个字符。

2 、在 DW 伪指令中,每一个字符串表达式只能由 1~2个字符组成,为每个字符串分配两个字节单元并以ASCII 码形式存放,字符串从右到左依次存放。

3 、在 DD 伪指令中,每一个字符串表达式只能由 1~2个字符组成,为每个字符串分配四个字节单元并以ASCII 码形式存放,字符串从右到左依次存放,两个高字节单元中存放 00H。

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

20/59

数据定义伪指令中的表达式是字符表达式

STRING1 DB ’ABC’

STRING2 DW ’AB’,’CD’

问:①这两条数据定义伪指令如何分配存储空间②STRING2+2访问的是存储单元的内容是多少?

STRING1

ARY[0]

… 00000H

FFFFFH

主存

STRING2

ARY[0]

STRING2+2

字节

43H42H

41H44H

43H

42H

41H

存储器分配示意图

偏移地址

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

21/59

数据定义伪指令中的表达式是字符表达式

STRING2 DD ’A’

… 00000H

FFFFFH

主存

STRING2

ARY[0]

双字

41H

00H00H

00H

存储器分配示意图

偏移地址

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

22/59

数据定义伪指令中的表达式是 ? 表达式

③ ? 表达式只分配存储单元,不赋初值。举例:VAR_A DB ?,?

VAR_B DW ?

VAR_C DD ?

VAR_A

ARY[0]

… 00000H

FFFFFH

主存

VAR_B

ARY[0] 双字

VAR_C

字节…

存储器分配示意图

00H00H

00H

00H

00H

00H

00H

00H

偏移地址

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

23/59

数据定义伪指令中的表达式是带 DUP 表达式④带 DUP 表达式为连续的存储单元提供重复数据。格式:

表达式 1是重复次数,表达式 2是重复数据的内容

变量名DB

DW

DD

表达式 1 DUP (表达式2 )

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

24/59

数据定义伪指令中的表达式是带 DUP 表达式

例:ARYB1 DB 10H DUP ( 2)

ARYB1

ARY[0]

… 00000H

FFFFFH

主存

ARY[0]

ARY[0]

重复 10H 次,共 10H 个字节

02H

02H…

02H

存储器分配示意图

偏移地址

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

25/59

数据定义伪指令中的表达式是带 DUP 表达式

ARYB2 DB 20H DUP (’ ABC’)

设 ARYB2 在数据段,其偏移地址是 0010H,问:①该数据定义伪指令如何分配存储空间②ARYB2+4访问的是哪个存储单元,其内容是多少 ?③ARYB2+59 访问的是哪个存储单元,其内容是多少 ?④ARYB2+60访问的是哪个存储单元,其内容是多少 ?ARYB2+60H 访问的是哪个存储单元 , 其内容是多少 ?

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

26/59

数据定义伪指令中的表达式是带 DUP 表达式

ARYB2 DB 20H DUP (’ABC’)

ARYB2… 00000H

FFFFFH

主存

重复 20H 次,共 60H 个字节

43H

存储器分配示意图

42H

41H42H

43H

41H

43H

41H42H

偏移地址

0010H

0014H

ARYB2 +60H

0070H

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

27/59

数据定义伪指令中的表达式是带 DUP 表达式

ARYB2 DB 20H DUP (’ABC’)

EA=ARYB2+4 内容 42HEA=ARYB2+59 内容 43HEA=ARYB2+60 内容 41HEA=ARYB2+60H 内容不确定

ARYB2… 00000H

FFFFFH

主存

重复 20H 次,共 60H 个字节

43H

存储器分配示意图

42H

41H42H

43H

41H

43H

41H42H

偏移地址

0010H

0014H

ARYB2 +60H

0070H

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

28/59

数据定义伪指令举例 2

S1 DB ’ IBM PC’ DB 0AH, 0DH问:①这两条数据定义伪指令如何分配存储空间②S1+2访问的是存储单元的内容是多少?③ MOV AH, S1+5 MOV AL , S1+6 MOV BH, S1+7(假设数据是在数据段中。) 指令执行后 AX 的内容是多少 ?BH的内容是多少 ?

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

29/59

数据定义伪指令举例 2

S1 DB ’IBM PC’

DB 0AH, 0DH

S1… 00000H

FFFFFH

主存

共 6 个字节4DH

存储器分配示意图

…49H42H

20H

50H43H

0AH0DH 共 2 个字

偏移地址

S1 + 1

S1 + 2S1 + 3S1 + 4

S1 + 5

S1 + 7S1 + 6

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

30/59

数据定义伪指令举例 3

VAR5 DB 15H DUP( 3 , 3 DUP(2))

问:①这条数据定义伪指令如何分配存储空间②VAR5+6访问的存储单元的内容是多少 ?

重复次数 重复次数

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

31/59

数据定义伪指令举例 3

VAR5 DB 15H DUP( 3, 3 DUP(2))

VAR5… 00000H

FFFFFH

主存

重复 15H次,共 54

H 个

字节

02H

存储器分配示意图

…03H02H

02H

03H02H

02H02H

共 3 个字节

02H

偏移地址

VAR5+6

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

32/59

数据定义伪指令举例 4

VAR6 DB 2H DUP( 1 ,3 DUP(3) ,’ AB’)

问:①这条数据定义伪指令如何分配存储空间②VAR6+6 访问的存储单元的内容是多少 ?

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

33/59

数据定义伪指令举例 4

VAR6 DB 2H DUP( 1, 3 DUP (3), ’AB’)

VAR6

… 00000H

FFFFFH

主存

重复 2H 次,共 12 个字节

03H

存储器分配示意图

…01H03H

03H

41H42H

01H03H

共 3 个字节

42H

VAR6+6

偏移地址

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

34/59

数据定义伪指令举例 4

VAR6 DB 2H DUP( 1, 3 DUP(3), ’AB’)

VAR6

… 00000H

FFFFFH

主存

重复 2H 次,共 12 个字节

03H

存储器分配示意图

…01H03H

03H

41H42H

01H03H

共 3 个字节

42H

…VAR6+6 访问的存储单元的内容是 01H

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

35/59

例: OPER1 DB ?, ? OPER2 DW ?, ? … MOV OPER1, 0 ; 字节指令 MOV OPER2, 0 ; 字指令

例: OPER1 DB 1, 2 OPER2 DW 1234H, 5678H … MOV AX, OPER1+1 × MOV AL, OPER2 × 类型不匹配

MOV AX, WORD PTR OPER1+1 MOV AL, BYTE PTR OPER2

(AX)=3402H (AL)=34H

0102

3412

78 56

OPER1

OPER2

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

36/59

PTR 属性操作符:可指定操作数的类型属性,它优先于隐含的类型属性。

格式: TYPE PTR 变量表达式 (同一个变量可使用不同的类型属性)TYPE : BYTE 、 WORD 、 DWORD 、 FWORD 、 QWORD 、 TBYT

E

LABEL 伪操作:也可用来指定操作数的类型属性。格式: NAME LABEL TYPE

对于数据项: NAME :变量 TYPE : BYTE 、 WORD 、 DWORD 、 FWORD 、 QWORD 、 TBYTE

对于可执行代码: NAME :标号 TYPE : NEAR 、 FAR

对于 16/32 位段, NEAR 为 2/4 字节, FAR 为 4/6 字节

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

37/59

例 4.16 : BYTE_ARRAY LABEL BYTE

WORD_ARRAY DW 50 DUP (?)

BYTE_ARRAYWORD_ARRAY 作用: 100 个字节的数

组中的第一个字节的地址分别有两个不同的类型的变量名。

MOV WORD _ARRAY+2 , 0

功能:把该数组中的第 3 和第 4 个字节置 0

MOV BYTE_ARRAY+2 , 0

功能:把该数组中的第 3 个字节置 0

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

38/59

4.2.5 表达式赋值伪操作 EQU• 格式:表达式名 EQU 表达式用途:用符号来表示常量或数据表达式;用符号表示字

符串;重新定义关键字或助记符。 CONSTANT EQU 256 ALPHA EQU 7 BETA EQU ALPHA-2 HELLO EQU ‘HOW ARE YOU !’ MOVE EQU MOV COUNT EQU CX

“=” 伪操作的格式:变量 = 表达式 … EMP=7 … EMP=EMP+1 …

注意: EQU 伪操作中的表达式不允许重复定义,而 =伪操作允许重复定义。

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

39/59

4.2.6 地址计数器与对准伪操作• 1. 地址计数器 $• 功能:保存当前正在汇编的指令的偏移地址

例: ( $ 用在指令中,表示本指令的第一个字节的地址) JNE $+6 ; 转向地址是 JNE 的首址 +6例: $用在伪操作的参数字段——表示地址计数器的当前值

例 4.17 ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4 01 0074

000200

ARRAY

7C 0078000300040082 007E00

0078+4

007E+4

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

40/59

• 2. ORG 伪操作• 作用:设置当前地址计数器中的值。• 格式: ORG 常数表达式 • 如常数表达式的值为 n,则 ORG 伪操作可以使下一个字节的地址成为常数表达式的值 n.例: ORG 100HSTART: …... ( START 的偏移地址是 100H)例如: SEG1 SEGMENT

ORG 10 VAR1 DW 1234H ORG 20 VAR2 DW 5678H ORG $+8 VAR3 DW 1357HSEG1 ENDS则 VAR1 的偏移地址值为 0AH,而 VAR2 的偏移地址值为 14HBUFFER LABEL BYTE ORG $+8其功能相当于: BUFFER DB 8 DUP (?)

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

41/59

• 3.EVEN 伪操作功能:使下一个变量或指令开始于偶数字节地址格式: EVEN ;使下一地址从偶地址开始

A DB ‘morning’EVENB DW 2 DUP (?)

• 4. ALIGN 伪操作功能:可以保证双字数组边界从 4的倍数开始。格式: ALIGN BOUNDARY (其中 BOUNDARY 必须是 2的幂)例如: ALIGN 4 ARRAY DB 100 DUP(?) … 就可保证 ARRAY 的值为 4的倍数。 ALIGN 2 和 EVEN 是等价的。

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

42/59

4.2.7基数控制伪操作功能:把默认的基数改变为 2~16 范围内的任何基数。

格式: .RADIX 表达式 (2,8,10,16) ;规定无标记数的基数

(表达式用十进制数表示)

MOV BX, 0FFH

MOV BX, 178

例: .RADIX 16

MOV BX, 0FF

MOV BX, 178D

注意:某个十六进制数的末字符为 D ,后应加 H 。

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

43/59

4.3 汇编语言程序格式源程序的每条语句可由 4 项组成,格式如下为: [ 符号地址 ] 操作 操作数 [; 注释 ]

变量 指令 寄存器 说明程序或语句 标号 伪指令 标号 的功能 名字 宏指令 变量 常数 表达式

表达式:是常数、寄存器、标号 / 变量、与一些操作符相结合的序列,也可以是数字表达式、 地址表达式

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

44/59

4.3.1 名字项标识符(变量 / 标号)的组成: 字母 A ~ Z

数字 0 ~ 9

专用字符 ? .   @ — $

注意:★ 除数字外,所有字符都可放在源语句的第一个位置。

★ 如果有 . 必须是第一个字符。

★ 一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字

变量和标号:所有的变量和标号都有三种属性段值 (SEG) :定义变量 / 标号的段起始地址

偏移量 (OFFSET) :段起始地址到定义变量 / 标号的位置间的字节数

类型 (TYPE) :变量(字节 / 字 / 双字 / 六字节 / 四字 / 十字节)

标号( NEAR / FAR )

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

45/59

保留字( Reserved Word)是汇编程序已经利用的标识符

主要有:★ 硬指令助记符——例如: MOV、 ADD★ 伪指令助记符——例如: DB、 EQU★ 操作符——例如: OFFSET 、 PTR★ 寄存器名——例如: AX、 CS★ 预定义符号——例如: @data

汇编语言大小写不敏感

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

46/59

4.3.2 操作项• 操作项:可以是指令、伪操作或宏指令的助记符。 指令,汇编程序将其翻译为机器语言指令。 伪操作,汇编程序将根据其所要求的功能进行处理。 宏指令,则将根据其定义展开。

• 4.3.3 操作数项• 操作数项由一个或多个表达式组成,多个操作数项之间一

般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个或两个,或三个,或一个也没有。对于伪操作或宏指令,则给出它们所要求的参数。

• 操作数项可以是常数、寄存器、标号、变量或表达式组成。表达式是常数、寄存器、标号、变量与一些操作符相组合的序列,可以有数字表达式和地址表达式两种。

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

47/59

( 1 )算术操作符: , , , , mod

例: ADD AX, A+2 ; 符号地址常数有意义

( 2 )逻辑操作符: AND, OR, XOR, NOT

移位操作符: SHL SHR

例: OPR1 EQU 25 ; 00011001B

OPR2 EQU 7 ; 00000111B

……

AND AX, OPR1 AND OPR2

汇编

AND AX, 1

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

48/59

( 3)关系操作符: EQ(相等) , NE (不等) , LT (小于) , LE (小于或等于) , GT (大于) , GE (大于或等于)

计算结果为逻辑值:真 0FFFFH 假 0000H 例: MOV FID, (OFFSET Y - OFFSET X) LE 128

X: ……

……

Y: ……

若 128( 假 0)

汇编结果 MOV FID, -1

汇编结果 MOV FID, 0

若 128( 真 0FFFFH)

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

49/59

( 4 )数值回送操作符: OFFSET / SEG 变量(或标号) 功能:回送变量或标号的偏址 / 段址 例: MOV BX, OFFSET X

MOV DX, SEG X

TYPE 变量(或标号) 变量: DB DW DD DF DQ DT 标号: NEAR FAR

值: 1 2 4 6 8 10 -1 -2

LENGTH 变量 功能:回送由 DUP 定义的变量的单元数(重复次数),其它情况回送 1。若用到了嵌套,返回最外层的重复次数。 SIZE 变量 功能: LENGTH*TYPE ,回送分配给变量的字节数。

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

50/59

例: ARRAY DW 100 DUP (?)

TABLE DB ‘ABCD’

ADD SI, TYPE ARRAY ; ADD SI, 2

ADD SI, TYPE TABLE ; ADD SI, 1

MOV CX, LENGTH ARRAY ; MOV CX, 100

MOV CX, LENGTH TABLE ; MOV CX, 1

MOV CX, SIZE ARRAY ; MOV CX, 200

MOV CX, SIZE TABLE ; MOV CX, 1

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

51/59

( 5)属性操作符:类型 PTR 表达式 例: MOV WORD PTR [BX], 5 指定存入寄存器中的是字单元

段操作符 用段寄存器:地址表达式,段名:地址表达式 或

组名:地址表达式来表示段属性 例: MOV ES: [BX], ALSHORT 标号 用来修饰 JMP 指令中转向地址的属性,指出转向

地址是在下一条指令地址的 +/-127个字节范围之内。 例: JMP SHORT NEXT

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

52/59

THIS 类型 它可以象 PTR 一样建立一个指定类型的或指定距离的地址操作数。该操

作数的段地址和偏移地址与下一个存储单元地址相同。 例: TA EQU THIS BYTE

TB DW 100 DUP (?)

此时 TA的偏移地址和 TB完全相同,但它是字节类型的;而 TB 则是字类型的。

NEXT EQU THIS FAR MOV CX, 100 这样, MOV指令有一个 FAR 属性的地址 NEXT ,这就允许其他段的 JMP

指令直接跳转到 NEXT来。字节分离操作符 它接收一个数或地址表达式, HIGH 取其高位字节, LOW取其低位字节。

例: CONS EQU 1234H HIGH MOV AH, HIGH CONS

LOW MOV AL, LOW CONS

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

53/59

4.4 汇编语言程序的上机过程编辑文本编辑器,如 EDIT.COM

源程序:文件名 .asm

汇编汇编程序,如 MASM.EXE

目标模块:文件名 .obj

连接连接程序,如 LINK.EXE

可执行文件:文件名 .exe

调试调试程序,如 DEBUG.EXE

应用程序 错误

错误

错误

错误

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

54/59

汇编语言源程序

• 源程序分别用两种格式书写第一种格式从 MASM 5.0 开始支持

– 简化段定义格式第二种格式 MASM 5.0 以前就具有

– 完整段定义格式

Hello, Everybody !

程序功能

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

55/59

• data segment• source_buffer db 40 d

up('a')• data ends• ;*********• extra segment• dest_buffer db 40 dup

(?)• extra ends• ;*************• code segment• main proc far• assume cs:code,ds:data,

es:extra

• start:

• push ds

• sub ax,ax

• push ax

• mov ax,data

• mov ds,ax

• mov ax,extra

• mov es,ax• lea si,source_buffer• lea di,dest_buffer• cld• mov cx,40• rep movsb• ret• main endp• code ends• end start

例 4.30

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

56/59

;lt301a.asm (文件名).model small ; 定义程序的存储模式.stack ; 定义堆栈段.data ; 定义数据段

string db ’Hello, Everybody !’,0dh,0ah,’$’; 在数据段定义要显示的字符串.code ; 定义代码段.startup ; 程序起始点 , 建立 DS 、 SSmov dx,offset string ; 指定字符串mov ah,9int 21h ; 利用功能调用显示信息.exit 0 ; 程序结束点,返回 DOSend ; 汇编结束

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

57/59

;SampleC.ASM.model small.stack.data... ; 在数据段定义数据.code

start : mov ax,@datamov ds,ax... ; 在代码段填入指令序列mov ax,4c00hint 21h... ; 子程序代码end start

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

58/59

;lt301b.asm (文件名)stack segment stack ; 定义堆栈段

dw 512 dup(?); 堆栈段有 512 字( 1024 字节)空间

stack ends ; 堆栈段结束data segment ; 定义数据段string db ’Hello, Everybody !’,0dh,0ah,’$’data endscode segment ’code’ ; 定义代码段

assume cs:code,ds:data,ss:stackstart: mov ax,data ; 建立 DS 段地址

mov ds,ax

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

59/59

mov dx,offset stringmov ah,9int 21hmov ax,4c00hint 21h ; 利用功能调用返回 DOS

code ends ; 代码段结束end start; 汇编结束,同时指明程序起始点