34
第第第 第第第第第第第第第 宏宏宏宏宏宏宏宏 宏宏宏宏 : 第第第第第第第第第第第第第 第第 第第第第第第第第第第第第第第第 一,一 第第第第第第第第第第第 () 宏宏宏宏宏第第第第第 第第第第第第第第第第第第第第宏宏 : 第第第第第第第第第第第第第第第第第第 第第第第第第第第第第第第第第第第第 ,。 第第第第第第第第第第 第第第第第第第第 ,。 第第第第第第.OBJ) 第第第第;( .LST 第第第第第第.CRF 第 第第第第第宏宏宏宏

第二章 汇编语言与汇编程序

  • Upload
    kory

  • View
    205

  • Download
    0

Embed Size (px)

DESCRIPTION

汇编过程. 检查源程序的语法错误,并给出出错信息。 产生 目标文件(. OBJ); 列表文件;(. LST ) 和 交叉索引文件(. CRF 文件) 。 展开宏指令。. 第二章 汇编语言与汇编程序. 宏汇编语言及编程. 汇编语言: 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言 (机器语言的符号化描述) 。 宏汇编语言: 增加 伪、宏指令 语句构成汇编 语言程序设计语言 。. 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。. 连接程序. 机器码目标程序. MASM.EXE. LINK.EXE. 汇编 程序. - PowerPoint PPT Presentation

Citation preview

Page 1: 第二章 汇编语言与汇编程序

第二章 汇编语言与汇编程序

•宏汇编语言及编程

汇编语言 : 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述)。

宏汇编语言:增加伪、宏指令语句构成汇编语言程序设计语言。

汇编 : 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。

• 检查源程序的语法错误,并给出出错信息。• 产生目标文件( .OBJ);列表文件;( .LST)和交叉索引文

件( .CRF文件)。• 展开宏指令。

•汇编过程

Page 2: 第二章 汇编语言与汇编程序

•列表文件( .LST文件);同时列出汇编语言源程序和机器语言目标程序的文件。•交叉索引文件( .CRF文件)列出程序中使用的符号、变量和标号以及引用情况。

•汇编过程

汇编与连接

EXAM.ASM

ASCII源程序

EXAM.OBJ

可选EXAM.LST

EXAM.CRF

机器码目标程序 MASM.EXE

汇编

汇编程序

EXAM.EXEEXAM.COM

LINK.EXE

连接

连接程序

可执行程序

Page 3: 第二章 汇编语言与汇编程序

•宏汇编语句的基本格式

指令性语句——由指令构成[ 标号: ] 操作码 操作数 [ ;注释 ]如 : START: MOV AX ,DATA

指示性语句——由命令(伪指令)构成[ 名字 / 变量 ] 命令 参数 [ ;注释 ]如 : DATA SEGMENT AT 2000H

( 代码段不能如此指定段地址 )•常量、变量和标号

• 常量 汇编源程序翻译成机器码目标程序期间已经有确定数值的量。分

为数字常量和符号常量两类。

Page 4: 第二章 汇编语言与汇编程序

2.1 符号指令中的表达式

数字常量:直接用数字进行表示的常量。

二进制: 10000100B 、 11110001020100B

十进制: 12356D

十六进制: 12ABH 、 0F56AH

(字母打头必须前面补 0,否则将出现汇编语法错误。)

如:

MOV AX , 100D

MOV BL , 0FAH

MOV CL , 1010 1000B

2.1.1 常量和数值表达式 •常量

Page 5: 第二章 汇编语言与汇编程序

符号常量:用标识符(常量名)表示的常量。命名规则:

1 ) ASCII 码字符2 )由 A~Z 、 a~z 、 0~9 、?、 @ 、 $ 及下划线构成。3 )?不能单独作为标识符。4 )不能为保留字及运算符。

合法标识符 :STA_124$

MOV_?

@103

非法标识符 :STA+124$

MOV

?

2.1 符号指令中的表达式

Page 6: 第二章 汇编语言与汇编程序

• 符号常量定义常量名 EQU ( = ) 数值或字母例如: AA EQU 30

BB = 1000HCC EQU 10001010BQQ = ‘ABC’MOV AX , AAMOV AL , AAMOV BX , BB

改善程序的可读性,程序的修改调试方便。“=” 可重复定义 EQU 不可重复定义常量不占有内存单元

2.1 符号指令中的表达式

Page 7: 第二章 汇编语言与汇编程序

2. 变量和地址表达式

变量是存储器中的数据或数据区的符号表示。

变量名即是数据的地址或数据区的首地址。

地址表达式是由变量、常量、寄存器 (SI 、 DI 、BX 、 BP) 的内容和运算符组成的有意义的式子。变量或地址表达式可给出指令中的存储器的地址。由于存储器是分段使用的,因此变量或地址表达式都具有 3 重属性:段地址、偏移地址和类型。

Page 8: 第二章 汇编语言与汇编程序

• 变量的段地址是指变量所在段的段首地址除以 10H 之商;

• 变量的偏移地址是指变量所在段的段首址到该变量的字节距离;

• 变量的段地址和偏移地址分别用 SEG 或OFFSET 两个算符来指定。

例如:变量 W 的段地址和偏移地址分别表示为 SEG W 和 OFFSET W 。

Page 9: 第二章 汇编语言与汇编程序

变量的定义

[ 变量名 ] 数据定义伪指令 表达式 [ ,…… ] 变量名:数据的地址或数据区的首地址 数据定义伪指令: DB( 定义字节 ) 、 DW( 定义字 ) 、 DD

( 定义双字 ) 、 DQ( 定义 4 字 ) 、 DT( 定义 10 字节 ) 表达式:数值表达式、 ASCII 码字符串、地址表达式、?

及 n DUP (表达式)

Page 10: 第二章 汇编语言与汇编程序

例如,在数据段 DATAl 中定义的变量如下: Wl DW B3 ; B1 DB 'AB$’ ; W2 DW -5 , 1994H ; B2 DB 4 DUP(?) ; D DD EB ; B3 DB 2 DUP(—1) DB l DUP(10 ,’ E’) DB ’13’ , 1 , 3在附加数据段 DATA2 中定义的变量如下: EB DB 8 DUP(?) EW DW ’AB’ ,’ CD’

Page 11: 第二章 汇编语言与汇编程序

3. 标号

标号是指令地址的符号表示,也可以是过程名。 标号的定义方式有两种: (1) 用“ :” 定义,直接写在指令助记符前。 如 CYCLE : MOV AL , [S1] (2) 用 PROC 和 ENDP 伪指令定义过程。

标号代表指令的地址,因而它也有 3 个属性:段地址、偏移地址和类型。

标号的段地址:定义该标号所在段的段地址。 标号的偏移地址:标号所在段的段首址到该标号定

义指令的字节距离。 标号的类型有 NEAR 和 FAR 两种。

Page 12: 第二章 汇编语言与汇编程序

4. 标量和标号类型的变更

格式: 类型 PTR 地址表达式

PTR 算符用来明确指出某个变量、标号或地址表达式的类型属性,或者使它们临时兼有与原定义所不同的类型属性,但仍保持它们原来的段地址和偏移地址属性不变。

如: BYTE PTR W1

Page 13: 第二章 汇编语言与汇编程序

•指示性语句(伪指令)4.1 汇编语言的基本语法

• 段定义伪指令格式:段名 SEGMENT [ 定位方式 ][ 组合方式 ][‘ 类别名’ ]

段名 ENDS

定义了以段名命名的存贮段。汇编时给该段名分配一个段基值。

例如:DATA SEGMENT

DATA ENDSCODE SEGMENT

CODE ENDS

定义了二个段,段名分别为 DATA 、 CODE 。

Page 14: 第二章 汇编语言与汇编程序

•指示性语句(伪指令)4.1 汇编语言的基本语法

• 段定义伪指令的参数 格式:段名 SEGMENT [ 定位类型 ][ 组合方式 ][‘ 类别名’ ]

• ( X )定位方式:段的起始地址边界PAGE—— 指定起始地址的低 8 位是 0 ,称页边界

XXXX XXXX XXXX 0000 0000B

PARA—— 指定起始地址的低 4 位是 0 ,称段边界XXXX XXXX XXXX XXXX 0000B

WORD—— 指定起始地址的低 2 位是 0 ,称字边界XXXX XXXX XXXX XXXX XX00B

BYTE—— 指定起始地址为任意值。XXXX XXXX XXXX XXXX XXXXB

PARA 为缺省方式

Page 15: 第二章 汇编语言与汇编程序

•指示性语句(伪指令)

汇编语言的基本语法

• 段定义伪指令的参数格式:段名 SEGMENT [ 定位类型 ][ 组合方式 ][‘ 类别名’ ]

• ( X )组合方式:连接程序时设定本段与其它段的连接方式。 ( 模块化程序设计 )

STACK :同名段构成一个连续的堆栈段,自动初始化 SP 。

空缺( NONE )不与任何段相连接。各段有独立段基址。

(缺省方式)

Page 16: 第二章 汇编语言与汇编程序

•指示性语句(伪指令)4.1 汇编语言的基本语法

• 段定义伪指令的参数格式:段名 SEGMENT [ 定位类型 ][ 组合方式 ][‘ 类别名’]

• ( X )类别名:用单引号括起来的字符串。类别名相同的段按先后顺序存放在一连续的存贮区中,形成统一的物理段。 ( 模块化程序设计 )

Page 17: 第二章 汇编语言与汇编程序

•指示性语句(伪指令)4.1 汇编语言的基本语法

•段寄存器说明伪指令 格式: ASSUME 段寄存器:段名 1 ,段寄存器:段名 2……

在代码段,告诉汇编程序 CS 、 DS 、 ES 、 SS应具有的符号段基址,但是段寄存器( CS 除外)还必须用传送指令赋值。一般紧跟在 SEGMENT 语句之后例如: CODE SEGMENT PARA

ASSUME CS : CODE , DS : DATAMOV AX , DATAMOV DS , AX ;传送指令赋值……

CODE ENDSDATA SEGMENT

……DATA ENDS

Page 18: 第二章 汇编语言与汇编程序

•指示性语句(伪指令)4.1 汇编语言的基本语法

•过程(子程序)定义伪指令 格式:过程名 PROC NEAR[FAR]

…………

过程名 ENDP

过程名:过程的起始地址,如子程序定义。类型: NEAR 近过程(主、子同段)

FAR 远过程(主、子在两个不同的代码段)

过程应由 RET 指令返回与远近无关。

Page 19: 第二章 汇编语言与汇编程序

•宏汇编语言的基本格式 4.1 汇编语言的基本语法

PUSH DSSUB AX , AXPUSH AXMOV AX , DATAMOV DS , AX

DATA SEGMENT

DATA ENDS

STACK SEGMENT STACK ‘STACK’

STACK ENDS

CODE SEGMENTBEGIN PROC FAR

ASSUME CS :CODE , DS :DATA , SS : STACK RET

BEGIN ENDPCODE ENDS

END BEGIN

•由几个段构成,一般有数据段、代码段、堆栈段或附加数据段组成,至少要有一代码段。•代码段第一条指令必须有汇编起始标号 START 。

Page 20: 第二章 汇编语言与汇编程序

2.5.1 系统功能调用 系统功能调用是 IBM PC微机系统为汇编用户提

供的一个程序接口。系统功能调用共有 4 类。我们仅

介绍设备管理系统功能调用中基本的 I/O管理功能。

使用系统功能调用的一般过程为:把调用号放入

AH 中,设置入口参数,然后执行 INT 21H 指令,最后

分析处理出口参数。

键盘和显示器的 DOS功能调用如表 2-3 所列。

本节仅介绍常用的 1 、 2 、 9 、 10 等 4 个系统功能调

用。

Page 21: 第二章 汇编语言与汇编程序

调用方法

设置入口参数

在 AH 设置功能号 m

执行中断指令 INT N

分析、应用出口参数

Page 22: 第二章 汇编语言与汇编程序

1. 1 号功能调用

MOV AH , 1

INT 21H

执行该调用时将等待键入,一旦有键按下就将该按键字符的 ASCII 码读入 AL ,并同时显示该字符。

2 . 2 号功能调用

MOV DL ,待显示字符的 ASCII 码

MOV AH , 2

INT 21H

本调用执行后,显示器显示待显示的字符。

Page 23: 第二章 汇编语言与汇编程序

3. 9 号功能调用

MOV DX ,待显示字符串的首偏移地址

MOV AH , 9

INT 21H

本调用执行后,显示器显示待显示的字符串。执

行前要在 DS 数据段定义一以 '$'结尾的字符串。

当需要输出数据区中某一字符串时,若该字符串

的尾部无 '$' ,一定要在其尾部置入一个 '$' ;若该字符

串中间就有 '$' ,则要采用 2 号功能调用逐个输出该字

符串中的字符。

Page 24: 第二章 汇编语言与汇编程序

4. 10 号功能调用

MOV DX ,数据区的首偏移地址

MOV AH , 10

INT 21H

当需要输入字符串时,应在 DS 数据段中事先定

义一个变量数据区 IBUF ,其定义格式如下:

IBUF DB 数据区大小, 0 ,数据区大小 DUP(0)

其中:数据区大小是一个无符号数( 2 ~ 255 )。

执行该调用时将等待键入 1 ~ 254 个字符,键入的

字符数可以少不能多,最后以回车结束本调用。

Page 25: 第二章 汇编语言与汇编程序

DUP(0) 前的“数据区大小”应与前面一个“数据

区大小”一致,因为数据区的大小是由前面的即第 1

个单元规定的,从第 3 个单元开始是预留给 10 号功能

调用装载键入字符的,留多了不能多装,是浪费;留

少了可多装,当输入的字符数超过预留的单元数时,

数据区就会自动往下延伸,冲掉紧跟其后的存储单元

中的内容,造成程序运行的混乱。第 2 个单元是预留

给装载 10 号功能调用时实际键入字符数的,实际键入

的字符数不包括回车 (0DH) 。

Page 26: 第二章 汇编语言与汇编程序

最后,要特别强调的是: 2 号功能调用、 9 号功能

调用和 10 号功能调用虽然未使用 AL ,但调用后也会破

坏 AL 中原来的内容。为防止 AL 中原来的内容被破坏

,在调用前应先保护 AL ,调用后再恢复。

Page 27: 第二章 汇编语言与汇编程序

2.5.2 功能调用应用举例

例 2 .5 编写汇编语言源程序,在显示器上显示

"wish you success!" 。

只需将欲显示字符串的 ASCII 码存放到字节变量

数据区中(字节变量数据区一定要以 $ 结束),用 9

号功能调用即可显示该字符串。程序如下:

OBF DB ' wish you success ! $ '

MOV DX, OFFSET OBF

MOV AH, 9

INT 21H

Page 28: 第二章 汇编语言与汇编程序

例 2 .6 将键入的 4 位十进制数(如 5 ,则键入 0005 )以压缩 BCD 数形式存入字变量 SW 中。

程序如下:

Page 29: 第二章 汇编语言与汇编程序

IBUF DB 5, 0, 5 DUP (0)

MOV DX, OFFSET IBUF ; 10 号功能调用

MOV AH, 10

INT 21H

MOV AX, WORD PTR IBUF+4 ;键入数的个位和十位送

AX

AND AX, 0F0FH ; ASCII 码变非压缩 BCD 数

MOV CL, 4

SHL AL ,CL ;将十位移至 AL 的高 4 位

OR AL, AH ;将 10 位和个位拼合在 AL 中

MOV BYTE PTR SW , AL ;存 BCD 数字的十位和个位

Page 30: 第二章 汇编语言与汇编程序

MOV AX, WORD PTR IBUF+2 ;键入数的百位和千位送AX

AND AX, 0F0FH ; ASCII 码变非压缩 BCD 数

SHL AL ,CL ;将千位移至 AL 的高 4 位

OR AL, AH ;千位和百位拼合在 AL 中

MOV BYTE PTR SW+1 , AL ;存千位和百位

Page 31: 第二章 汇编语言与汇编程序

例 2 .7 "镜子 " 程序。

“镜子”程序的功能是接收并回显键盘输入的一

串字符,然后在下一行再将该串字符显示出来。可见

该功能主要由 10 号功能调用和 9 号功能调用来完成。

根据 10 号功能调用的入口参数,在数据段定义了字节

变量 IBUF 。第 1 个单元是允许键入字符数 FFH ,即最

多可接收除回车外的 254 个任意字符和一个回车;第2

单元是预留装载实际键入字符个数的;从第 3 单元开

始是预留装载键入字符的。

Page 32: 第二章 汇编语言与汇编程序

10 号功能调用结束后,只要把字符 $放入存放回

车的单元 ,即可使用 9 号功能调用把自 IBUF+2 单元开始的字符送显示器显示。

"镜子 " 程序如下:

OBUF DB '>' , 0DH, 0AH, ' $ '

IBUF DB 0FFH, 0, 255 DUP (0)

Page 33: 第二章 汇编语言与汇编程序

MOV DX, OFFSET OBUF ;显示“ >”, 回车,换行

MOV AH, 9

INT 21H

MOV DX, OFFSET IBUF ;键入并显示字符串

MOV AH, 10

INT 21H

Page 34: 第二章 汇编语言与汇编程序

MOV BL, IBUF+1 ;取得实际键入的字符串长度

MOV BH, 0

MOV IBUF [BX+2], ‘$’ ;将 "$"送字符串后

MOV DL, 0AH ;换行

MOV AH, 2

INT 21H

MOV DX, OFFSET IBUF+2 ;再显示键入的字符串

MOV AH, 9

INT 21H