310 likes | 446 Views
第 7 章. 高级汇编语言技术及其他. 第 7 章. 宏定义、宏调用和宏展开 BIOS 中断和 DOS 中断 初级文件管理 高级文件管理. 宏定义 宏定义有两种格式 : 1 、简单宏定义 宏名 MACRO …… ;宏体 …… ;宏体 ENDM [ 例 7-1] 简单宏定义示例 CRLF MACRO MOV AH, 02H MOV DL, 0DH ;回车
E N D
第7章 高级汇编语言技术及其他
第7章 • 宏定义、宏调用和宏展开 • BIOS中断和DOS中断 • 初级文件管理 • 高级文件管理
宏定义 宏定义有两种格式: 1、简单宏定义 宏名 MACRO …… ;宏体 …… ;宏体 ENDM [例7-1]简单宏定义示例 CRLF MACRO MOV AH, 02H MOV DL, 0DH ;回车 INT 21H MOV DL, 0AH ;换行 MOV AH, 02H INT 21H ENDM
2、带形参的宏定义 宏名 MACRO <形参表> …… ;宏体 …… ;宏体 ENDM [例7-2]带形参的宏定义示例 MULTIPLY MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX MOV AX, OPR1 IMUL OPR2 MOV RELUST, AX MOV RESULT+2, DX POP AX POP DX ENDM
宏调用 宏调用有两种格式: 1、对简单的宏定义的调用:宏名 2、带形参的宏定义的调用:宏名<实参表> [例7-3]宏调用示例 INIT MACRO CS_NAME, DS_NAME, SS_NAME, ES_NAME ASSUME CS:CS_NAME, DS:DS_NAME ASSUME SS:SS_NAME, ES:ES_NAME PUSH DS MOV AX, 0 PUSH AX MOV AX, DS_NAME ;填入数据段段基址 MOV DS, AX MOV AX, ES:ES_NAME ;填入附加段段基址 MOV ES, AX ENDM ...... MAIN PROC FAR INIT C_SEG, D_SEG, S_SEG, E_SEG;宏调用 ......
宏扩展(宏展开) 宏扩展——汇编程序对汇编源程序汇编时将宏体 插入到宏调用处 [例7-4]宏扩展示例 ...... MAIN PROC FAR INIT C_SEG, D_SEG, S_SEG, E_SEG + PUSH DS + MOV AX, 0 + PUSH AX + MOV AX, D_SEG ;实参替换形参 + MOV DS, AX + MOV AX, ES:E_SEG + MOV ES, AX 说明: 汇编程序在所展开的指令前加‘+’号以示区别
宏指令与子程序的区别 子程序 宏指令 程序执行期间 在汇编期间展开 由主程序调用 它只占有自身 与调用次数有关,每调用一次 大小的空间 就把宏定义体展开一次 执行时需增加时间 直接执行宏体 上的额外开销
宏定义的进一步讨论: 1、宏定义可以无变元 2、变元可以是操作码 [例7-5] 宏定义: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM 宏调用: FOO WORD_VAR, INC, AX 宏展开: + MOV AX, WORD_VAR + INC AX
3、变元可以是操作码的一部分,必须用&作为分隔符3、变元可以是操作码的一部分,必须用&作为分隔符 [例7-6] 宏定义: LEAP MACRO COND, LAB J&COND LAB ENDM 宏调用: LEAP Z, THERE 宏展开: + JZ THERE
4、变元是ASCII串 [例7-7] 宏定义: MSGGEN MACRO LAB, NUM, XYZ LAB&NUM DB ‘HELLO MR.&XYZ’ ENDM 宏调用: MSGGEN MSG, 1, TAYLOR 宏展开: + MSG1 DB ‘HELLO MR.TAYLOR’
5、宏定义体内允许使用标号 此时,须使用LOCAL伪操作 [例7-8] 宏定义: ABSOL MACRO OPER LOCAL NEXT CMP OPER, 0 JGE NEXT NEG OPER NEXT: ENDM 宏调用: ABSOL VAR …… ABSOL BX 宏展开: + CMP VAR, 0 + JGE ??0000 + NEG VAR + ??0000: …… + CMP BX, 0 + JGE ??0001 + NEG BX + ??0001:
6、宏定义中可以使用宏调用,(必须先定义后调用)6、宏定义中可以使用宏调用,(必须先定义后调用) [例7-9] 宏定义: DIF MACRO X, Y MOV AX, X SUB AX, Y ENDM DIFSQR MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX DIF OPR1, OPR2 IMUL AX MOV RESULT, AX POP AX POP DX ENDM
宏调用: DIFSQR VAR1, VAR2, VAR3 宏展开: + PUSH DX + PUSH AX + MOV AX, VAR1 + SUB AX, VAR2 + IMUL AX + MOV VAR3, AX + POP AX + POP DX
BIOS中断和DOS中断 BIOS中断分为四类: 中断种类 中断类型号 所含功能 内中断 00~07H 被零除中断、单步中断 不可屏蔽中断、断点中断 溢出中断、屏幕拷贝 外中断 08~0FH 处理计时器、键盘 通信口、软盘、硬盘 设备驱动 10H~17H 显示器、内存检查 通信I/O 特殊中断 18H~1FH ROMBASIC、DOS自举 日期调用、键盘中断 计时器控制
BIOS中断调用 程序中可直接用INT n 指令调用 经常用到的BIOS中断为10H、13H、14H、16H、17H 指令格式 包含功能 INT 10H 提供显示方式设置、光标大小与位置设置 屏幕滚动、写字符、写像素点等 INT 13H 对磁盘的操作功能 (包括写、读、格式化等) INT 14H 负责对RS232异步通信口的输入输出 INT 16H 键盘操作(从键盘读字符、读键盘状态 和读特殊键标志等 INT 17H 打印机操作(读打印机状态、打印字符 初始化打印机等
[例7-10] BIOS中断调用示例 欲打印字符'S',相应的系统调用如下: MOV AH,1 ;初始化打印机子功能号 MOV DX,0 ;打印机号 INT 17H ;初始化打印机 MOV AH, 0 ;打印机子功能号 MOV DX, 0 ;打印机号 MOV AL, 'S' ;欲打印的字符 INT 17H ;打印S
DOS中断 DOS中断类型号为20~27H 涉及系统中断返回、系统功能调用、绝对磁盘读写等。 其中,应用最多的是INT 21H,有100个子功能 按其子功能可分为五组: 1、字符输入输出 2、文件管理 分为初级文件管理和高级文件管理 3、内存管理 分配/释放内存空间、修改已分配的空间等 4、作业管理 装入程序、进程管理等 5、其他资源管理 取日期/时间、设置中断向量等
初级文件管理 初级文件管理与FCB(文件控制快)有关 FCB的结构共36字节长,分10个信息域:(以下单位为字节) 0: 指定驱动器 1--8: 文件名 9--11: 扩展名 12--13: 当前块号,以文件开始为相对值,每块128个记录, 打开文件时为0 14--15: 记录长度,以字节为单位 16--19: 文件大小,以字节为单位 20--21: 文件建立或最后修改日期 22--31: 由DOS填入 32 : 当前块内的相对记录号(0--127) 33--36: 以文件的开始为基准的相对记录编号
初级文件管理(1) AH 功能 调用参数 返回参数 16H 在当前目录 (DS:DX)=FCB首址 AL=00,文件创建成功 下创建文件 AL=FF,文件创建失败 0FH 打开文件 (DS:DX)=FCB首址 AL=00,文件打开成功 AL=FF,文件打开失败 14H 顺序读 (DS:DX)=FCB首址 AL=00,读成功 一个记录 AL=01,文件结束,无记录 AL=02,盘空间不够 AL=03,文件结束, 记录不完整 15H 顺序写 (DS:DX)=FCB首址 AL=00,写成功 一个记录 AL=01,盘满 AL=0FF,失败
初级文件管理(2) AH 功能 调用参数 返回参数 10H 关闭文件 (DS:DX)=FCB首址 AL=00,正常关闭 AL=FF,失败 13H 删除文件 (DS:DX)=FCB首址 AL=00,正常删除 AL=FF,失败 17H 更改文件名 (DS:DX)=FCB首址 AL=00,成功 DX+17=新文件名首址 AL=FF,失败 1AH 设置DTA (DS:DX)= DAT 首址 无 注:DTA是磁盘数据传输区。
高级文件管理 高级文件管理以文件代号为线索,简单易行,是文件 管理的主导方法。 几个基本概念: 1、路径名和ASCIZ串 在处理文件时,首先要提供一个ASCIZ串的地址 ASCIZ串包括文件的路径名和一个全0的字节 例如,下面是两个ASCIZ串: PATHNAME1 DB ‘A:\TEST.PAS’, 0 PATHNAME2 DB ‘C:\WINDOWS\CLOUDS.BMP’, 0 可把串的地址送DX: LEA DX, PATHNAME1
2、文件代号和错误返回码 存取文件要借助于文件代号,文件代号是由打开文件 功能和建立文件功能传送到AX的一个16位数。 对于标准设备,已由DOS预定义好它们的文件代号: 0=标准输入设备 1=标准输出设备 2=标准错误输出设备 3=标准辅助设备 4=标准打印设备 其他文件代号一律从6开始。 在文件操作中,若存在错误,通过错误返回码返回, 以查找出错原因。
3、文件属性 文件属性是一个说明文件特性的字节。其各位含义 如下图所示:
高级文件管理(1) 功能号 功能 调用参数 返回参数 3CH 建文件 (DS:DX)=ASCIZ串首址 若CF=0,成功 CX=文件属性 (AX)=文件代号 否则失败 (AX)=错误码 3DH 打开文件 (DS:DX)=ASCIZ串首址 若CF=0,成功 (AL)=0 读(AX)=文件代号 =1 写 否则失败 =2 读/写 (AX)=错误码 3EH 关闭文件 (BX)=文件代号 若CF=0,操作成功 否则失败 3FH 读文件 (DS:DX)=缓冲区首址 若CF=0,读成功 (BX)=文件代号 (AX)=实际读 (CX)=读入字节数 的字节数 否则(AX)=错误码
高级文件管理(2) 功能号 功能 调用参数 返回参数 40H 写文件 (DS:DX)=ASCIZ串首址 若CF=0,成功 BX=文件代号 (AX)=实际 CX=写入的字节数 写入的字节数 否则失败 (AX)=错误码 41H 删除文件 (DS:DX)=ASCIZ串首址 若CF=0,成功 否则失败 42H 移动文件 (CX:DX)=偏移量 若CF=0,成功 指针 (AL)=移动方式码 否则失败 (BX)=文件代号 43H 取/置文 (DS:DX)=ASCIZ串首址 若CF=0,成功 件属性 (AL)=0,取文件属性 (CX)=新属性 (AL)=1,置文件属性 否则失败
[例7-11]建立文件示例 调用参数: (AH)=3CH (DS:DX)=ASCIZ串的首地址 (CX)=文件属性 MOV AH, 3CH ;子功能号 MOV CX, 00 ;文件属性 LEA DX, PATHNAME1 ;ASCIZ 串地址 INT 21H JC ERROR ;CF=1, 转 MOV HANDLE1, AX ;保存文件代号
[例7-12]写磁盘文件示例 调用参数: (AH)=40H (DS:DX)=缓冲区的首地址 (BX)=文件代号 (CX)=写入的字节数 HANDLE DW ? ;文件代号 OUTREC DB 256 DUP (?) ;缓冲区 MOV AH, 40H ;子功能号 MOV BX, HANDLE ;BX<--文件代号 MOV CX, 256 ;CX<--写盘字节数 LEA DX, OUTREC ;DX缓冲区首址 INT 21H JC ERROR2 ;CF=1, 转 CMP AX, 256 ;若成功AX中为实际写入字节数 JNE ERROR3 ;字节数不等,则错误
[例7-13]打开文件示例 调用参数: (AH)=3DH (DS:DX)=ASCIZ串的首地址 (AL)=存取代码: 0----为读打开 1----为写打开 2----为读和写打开文件 MOV AH, 3DH ;子功能号 MOV AL, 00 ;只读属性 LEA DX, PATHNAME1 INT 21H JC ERROR4 ; CF=1, 转 MOV HANDLE, AX ;保存文件代号
[例7-14]读取文件示例 调用参数: (AH)=3FH (DS:DX)=输入数据缓冲区的地址 (BX)=文件代号 (CX)=要读取的字节数 HANDLE DW ? ;文件代号 INPREC DB 512 DUP(?) ;数据缓冲区 MOV AH, 3FH ;子功能号 MOV BX, HANDLE ;BX<--文件代号 MOV CX, 512 ;CX<--读取的字节数 LEA DX, INPREC ;DX<--缓冲区地址 INT 21H JC ERROR5 ;CF=1, 转 CMP AX, 0 ;实际读入字节数在AX JE ENDFILE
[例7-15]关闭文件示例 调用参数: (AH)=3EH (BX)=文件代号 一个文件在文件操作完成后,必须关闭文件 MOV AH, 3EH MOV BX, HANDLE INT 21H