340 likes | 491 Views
汇编过程. 检查源程序的语法错误,并给出出错信息。 产生 目标文件(. OBJ); 列表文件;(. LST ) 和 交叉索引文件(. CRF 文件) 。 展开宏指令。. 第二章 汇编语言与汇编程序. 宏汇编语言及编程. 汇编语言: 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言 (机器语言的符号化描述) 。 宏汇编语言: 增加 伪、宏指令 语句构成汇编 语言程序设计语言 。. 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。. 连接程序. 机器码目标程序. MASM.EXE. LINK.EXE. 汇编 程序.
E N D
汇编过程 • 检查源程序的语法错误,并给出出错信息。 • 产生目标文件(.OBJ);列表文件;(.LST)和交叉索引文件(.CRF文件)。 • 展开宏指令。 第二章 汇编语言与汇编程序 • 宏汇编语言及编程 汇编语言:一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述)。 宏汇编语言:增加伪、宏指令语句构成汇编语言程序设计语言。 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。
连接程序 机器码目标程序 MASM.EXE LINK.EXE 汇编程序 EXAM.ASM 汇编 EXAM.OBJ 连接 EXAM.LST 可选 ASCII 源程序 EXAM.EXE EXAM.COM EXAM.CRF 可执行程序 • 汇编过程 • 列表文件(.LST文件); • 同时列出汇编语言源程序和机器语言目标程序的文件。 • 交叉索引文件(.CRF文件) • 列出程序中使用的符号、变量和标号以及引用情况。 汇编与连接
常量、变量和标号 • 常量 汇编源程序翻译成机器码目标程序期间已经有确定数值的量。分为数字常量和符号常量两类。 • 宏汇编语句的基本格式 指令性语句——由指令构成 [标号:] 操作码操作数 [;注释] 如: START: MOV AX ,DATA 指示性语句——由命令(伪指令)构成 [名字/变量] 命令 参数 [;注释] 如: DATA SEGMENT AT 2000H (代码段不能如此指定段地址)
2.1符号指令中的表达式 2.1.1常量和数值表达式 • 常量 数字常量:直接用数字进行表示的常量。 二进制:10000100B、11110001020100B 十进制:12356D 十六进制:12ABH、0F56AH (字母打头必须前面补0,否则将出现汇编语法错误。) 如: MOV AX,100D MOV BL,0FAH MOV CL,1010 1000B
合法标识符: STA_124$ MOV_? @103 非法标识符: STA+124$ MOV ? 2.1符号指令中的表达式 符号常量:用标识符(常量名)表示的常量。 命名规则: 1)ASCII码字符 2)由A~Z、a~z、0~9 、?、@、$及下划线构成。 3)?不能单独作为标识符。 4)不能为保留字及运算符。
2.1符号指令中的表达式 • 符号常量定义 常量名 EQU(=) 数值或字母 例如: AA EQU 30 BB = 1000H CC EQU 10001010B QQ = ‘ABC’ MOV AX,AA MOV AL,AA MOV BX,BB 改善程序的可读性,程序的修改调试方便。 “=”可重复定义 EQU不可重复定义 常量不占有内存单元
2. 变量和地址表达式 变量是存储器中的数据或数据区的符号表示。 变量名即是数据的地址或数据区的首地址。 地址表达式是由变量、常量、寄存器(SI、DI、BX、BP)的内容和运算符组成的有意义的式子。 变量或地址表达式可给出指令中的存储器的地址。由于存储器是分段使用的,因此变量或地址表达式都具有3重属性:段地址、偏移地址和类型。
变量的段地址是指变量所在段的段首地址除以10H之商;变量的段地址是指变量所在段的段首地址除以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 ENDS CODE 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:DATA MOV AX,DATA MOV DS,AX ;传送指令赋值 …… CODE ENDS DATA SEGMENT …… DATA ENDS
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 过程(子程序)定义伪指令 • 格式:过程名 PROC NEAR[FAR] • ………… • 过程名 ENDP • 过程名:过程的起始地址,如子程序定义。 • 类型:NEAR 近过程(主、子同段) • FAR 远过程(主、子在两个不同的代码段) 过程应由RET指令返回与远近无关。
4.1汇编语言的基本语法 • 宏汇编语言的基本格式 DATA SEGMENT • 由几个段构成,一般有数据段、代码段、堆栈段或附加数据段组成,至少要有一代码段。 • 代码段第一条指令必须有汇编起始标号START。 … DATA ENDS STACK SEGMENT STACK ‘STACK’ … STACK ENDS CODE SEGMENT BEGIN PROC FAR ASSUME CS:CODE,DS: DATA,SS:STACK … … RET BEGIN ENDP CODE ENDS END BEGIN PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX
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