Upload
kory
View
205
Download
0
Embed Size (px)
DESCRIPTION
汇编过程. 检查源程序的语法错误,并给出出错信息。 产生 目标文件(. OBJ); 列表文件;(. LST ) 和 交叉索引文件(. CRF 文件) 。 展开宏指令。. 第二章 汇编语言与汇编程序. 宏汇编语言及编程. 汇编语言: 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言 (机器语言的符号化描述) 。 宏汇编语言: 增加 伪、宏指令 语句构成汇编 语言程序设计语言 。. 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。. 连接程序. 机器码目标程序. MASM.EXE. LINK.EXE. 汇编 程序. - PowerPoint PPT Presentation
Citation preview
第二章 汇编语言与汇编程序
•宏汇编语言及编程
汇编语言 : 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述)。
宏汇编语言:增加伪、宏指令语句构成汇编语言程序设计语言。
汇编 : 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。
• 检查源程序的语法错误,并给出出错信息。• 产生目标文件( .OBJ);列表文件;( .LST)和交叉索引文
件( .CRF文件)。• 展开宏指令。
•汇编过程
•列表文件( .LST文件);同时列出汇编语言源程序和机器语言目标程序的文件。•交叉索引文件( .CRF文件)列出程序中使用的符号、变量和标号以及引用情况。
•汇编过程
汇编与连接
EXAM.ASM
ASCII源程序
EXAM.OBJ
可选EXAM.LST
EXAM.CRF
机器码目标程序 MASM.EXE
汇编
汇编程序
EXAM.EXEEXAM.COM
LINK.EXE
连接
连接程序
可执行程序
•宏汇编语句的基本格式
指令性语句——由指令构成[ 标号: ] 操作码 操作数 [ ;注释 ]如 : START: MOV AX ,DATA
指示性语句——由命令(伪指令)构成[ 名字 / 变量 ] 命令 参数 [ ;注释 ]如 : DATA SEGMENT AT 2000H
( 代码段不能如此指定段地址 )•常量、变量和标号
• 常量 汇编源程序翻译成机器码目标程序期间已经有确定数值的量。分
为数字常量和符号常量两类。
2.1 符号指令中的表达式
数字常量:直接用数字进行表示的常量。
二进制: 10000100B 、 11110001020100B
十进制: 12356D
十六进制: 12ABH 、 0F56AH
(字母打头必须前面补 0,否则将出现汇编语法错误。)
如:
MOV AX , 100D
MOV BL , 0FAH
MOV CL , 1010 1000B
2.1.1 常量和数值表达式 •常量
符号常量:用标识符(常量名)表示的常量。命名规则:
1 ) ASCII 码字符2 )由 A~Z 、 a~z 、 0~9 、?、 @ 、 $ 及下划线构成。3 )?不能单独作为标识符。4 )不能为保留字及运算符。
合法标识符 :STA_124$
MOV_?
@103
非法标识符 :STA+124$
MOV
?
2.1 符号指令中的表达式
• 符号常量定义常量名 EQU ( = ) 数值或字母例如: AA EQU 30
BB = 1000HCC EQU 10001010BQQ = ‘ABC’MOV AX , AAMOV AL , AAMOV BX , BB
改善程序的可读性,程序的修改调试方便。“=” 可重复定义 EQU 不可重复定义常量不占有内存单元
2.1 符号指令中的表达式
2. 变量和地址表达式
变量是存储器中的数据或数据区的符号表示。
变量名即是数据的地址或数据区的首地址。
地址表达式是由变量、常量、寄存器 (SI 、 DI 、BX 、 BP) 的内容和运算符组成的有意义的式子。变量或地址表达式可给出指令中的存储器的地址。由于存储器是分段使用的,因此变量或地址表达式都具有 3 重属性:段地址、偏移地址和类型。
• 变量的段地址是指变量所在段的段首地址除以 10H 之商;
• 变量的偏移地址是指变量所在段的段首址到该变量的字节距离;
• 变量的段地址和偏移地址分别用 SEG 或OFFSET 两个算符来指定。
例如:变量 W 的段地址和偏移地址分别表示为 SEG W 和 OFFSET W 。
变量的定义
[ 变量名 ] 数据定义伪指令 表达式 [ ,…… ] 变量名:数据的地址或数据区的首地址 数据定义伪指令: DB( 定义字节 ) 、 DW( 定义字 ) 、 DD
( 定义双字 ) 、 DQ( 定义 4 字 ) 、 DT( 定义 10 字节 ) 表达式:数值表达式、 ASCII 码字符串、地址表达式、?
及 n DUP (表达式)
例如,在数据段 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’
3. 标号
标号是指令地址的符号表示,也可以是过程名。 标号的定义方式有两种: (1) 用“ :” 定义,直接写在指令助记符前。 如 CYCLE : MOV AL , [S1] (2) 用 PROC 和 ENDP 伪指令定义过程。
标号代表指令的地址,因而它也有 3 个属性:段地址、偏移地址和类型。
标号的段地址:定义该标号所在段的段地址。 标号的偏移地址:标号所在段的段首址到该标号定
义指令的字节距离。 标号的类型有 NEAR 和 FAR 两种。
4. 标量和标号类型的变更
格式: 类型 PTR 地址表达式
PTR 算符用来明确指出某个变量、标号或地址表达式的类型属性,或者使它们临时兼有与原定义所不同的类型属性,但仍保持它们原来的段地址和偏移地址属性不变。
如: BYTE PTR W1
•指示性语句(伪指令)4.1 汇编语言的基本语法
• 段定义伪指令格式:段名 SEGMENT [ 定位方式 ][ 组合方式 ][‘ 类别名’ ]
段名 ENDS
定义了以段名命名的存贮段。汇编时给该段名分配一个段基值。
…
例如:DATA SEGMENT
…
DATA ENDSCODE SEGMENT
…
CODE ENDS
定义了二个段,段名分别为 DATA 、 CODE 。
•指示性语句(伪指令)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 为缺省方式
•指示性语句(伪指令)
汇编语言的基本语法
• 段定义伪指令的参数格式:段名 SEGMENT [ 定位类型 ][ 组合方式 ][‘ 类别名’ ]
• ( X )组合方式:连接程序时设定本段与其它段的连接方式。 ( 模块化程序设计 )
STACK :同名段构成一个连续的堆栈段,自动初始化 SP 。
空缺( NONE )不与任何段相连接。各段有独立段基址。
(缺省方式)
•指示性语句(伪指令)4.1 汇编语言的基本语法
• 段定义伪指令的参数格式:段名 SEGMENT [ 定位类型 ][ 组合方式 ][‘ 类别名’]
• ( X )类别名:用单引号括起来的字符串。类别名相同的段按先后顺序存放在一连续的存贮区中,形成统一的物理段。 ( 模块化程序设计 )
•指示性语句(伪指令)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
•指示性语句(伪指令)4.1 汇编语言的基本语法
•过程(子程序)定义伪指令 格式:过程名 PROC NEAR[FAR]
…………
过程名 ENDP
过程名:过程的起始地址,如子程序定义。类型: NEAR 近过程(主、子同段)
FAR 远过程(主、子在两个不同的代码段)
过程应由 RET 指令返回与远近无关。
•宏汇编语言的基本格式 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 。
…
2.5.1 系统功能调用 系统功能调用是 IBM PC微机系统为汇编用户提
供的一个程序接口。系统功能调用共有 4 类。我们仅
介绍设备管理系统功能调用中基本的 I/O管理功能。
使用系统功能调用的一般过程为:把调用号放入
AH 中,设置入口参数,然后执行 INT 21H 指令,最后
分析处理出口参数。
键盘和显示器的 DOS功能调用如表 2-3 所列。
本节仅介绍常用的 1 、 2 、 9 、 10 等 4 个系统功能调
用。
调用方法
设置入口参数
在 AH 设置功能号 m
执行中断指令 INT N
分析、应用出口参数
1. 1 号功能调用
MOV AH , 1
INT 21H
执行该调用时将等待键入,一旦有键按下就将该按键字符的 ASCII 码读入 AL ,并同时显示该字符。
2 . 2 号功能调用
MOV DL ,待显示字符的 ASCII 码
MOV AH , 2
INT 21H
本调用执行后,显示器显示待显示的字符。
3. 9 号功能调用
MOV DX ,待显示字符串的首偏移地址
MOV AH , 9
INT 21H
本调用执行后,显示器显示待显示的字符串。执
行前要在 DS 数据段定义一以 '$'结尾的字符串。
当需要输出数据区中某一字符串时,若该字符串
的尾部无 '$' ,一定要在其尾部置入一个 '$' ;若该字符
串中间就有 '$' ,则要采用 2 号功能调用逐个输出该字
符串中的字符。
4. 10 号功能调用
MOV DX ,数据区的首偏移地址
MOV AH , 10
INT 21H
当需要输入字符串时,应在 DS 数据段中事先定
义一个变量数据区 IBUF ,其定义格式如下:
IBUF DB 数据区大小, 0 ,数据区大小 DUP(0)
其中:数据区大小是一个无符号数( 2 ~ 255 )。
执行该调用时将等待键入 1 ~ 254 个字符,键入的
字符数可以少不能多,最后以回车结束本调用。
DUP(0) 前的“数据区大小”应与前面一个“数据
区大小”一致,因为数据区的大小是由前面的即第 1
个单元规定的,从第 3 个单元开始是预留给 10 号功能
调用装载键入字符的,留多了不能多装,是浪费;留
少了可多装,当输入的字符数超过预留的单元数时,
数据区就会自动往下延伸,冲掉紧跟其后的存储单元
中的内容,造成程序运行的混乱。第 2 个单元是预留
给装载 10 号功能调用时实际键入字符数的,实际键入
的字符数不包括回车 (0DH) 。
最后,要特别强调的是: 2 号功能调用、 9 号功能
调用和 10 号功能调用虽然未使用 AL ,但调用后也会破
坏 AL 中原来的内容。为防止 AL 中原来的内容被破坏
,在调用前应先保护 AL ,调用后再恢复。
2.5.2 功能调用应用举例
例 2 .5 编写汇编语言源程序,在显示器上显示
"wish you success!" 。
只需将欲显示字符串的 ASCII 码存放到字节变量
数据区中(字节变量数据区一定要以 $ 结束),用 9
号功能调用即可显示该字符串。程序如下:
OBF DB ' wish you success ! $ '
MOV DX, OFFSET OBF
MOV AH, 9
INT 21H
例 2 .6 将键入的 4 位十进制数(如 5 ,则键入 0005 )以压缩 BCD 数形式存入字变量 SW 中。
程序如下:
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 数字的十位和个位
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 ;存千位和百位
例 2 .7 "镜子 " 程序。
“镜子”程序的功能是接收并回显键盘输入的一
串字符,然后在下一行再将该串字符显示出来。可见
该功能主要由 10 号功能调用和 9 号功能调用来完成。
根据 10 号功能调用的入口参数,在数据段定义了字节
变量 IBUF 。第 1 个单元是允许键入字符数 FFH ,即最
多可接收除回车外的 254 个任意字符和一个回车;第2
单元是预留装载实际键入字符个数的;从第 3 单元开
始是预留装载键入字符的。
10 号功能调用结束后,只要把字符 $放入存放回
车的单元 ,即可使用 9 号功能调用把自 IBUF+2 单元开始的字符送显示器显示。
"镜子 " 程序如下:
OBUF DB '>' , 0DH, 0AH, ' $ '
IBUF DB 0FFH, 0, 255 DUP (0)
MOV DX, OFFSET OBUF ;显示“ >”, 回车,换行
MOV AH, 9
INT 21H
MOV DX, OFFSET IBUF ;键入并显示字符串
MOV AH, 10
INT 21H
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