400 likes | 663 Vues
汇编语言. 数学科学学院计算机应用技术专业. 修兴强 & Ariel 北京师范大学数学科学学院 202.112.84.202/~xiux/download.php E-mail: xq_xiu@yahoo.com.cn. 第 13 章 16 位 MS-DOS 程序设计. MS-DOS 和 IBM-PC.
E N D
汇编语言 数学科学学院计算机应用技术专业 修兴强 & Ariel 北京师范大学数学科学学院 202.112.84.202/~xiux/download.php E-mail: xq_xiu@yahoo.com.cn
MS-DOS和IBM-PC • 在使用Intel 8088处理器的IBM个人计算机上,IBM的PC-DOS是首个实地址模式操作系统,它后来演化成了Microsoft的MS-DOS。实地址模式通常被称为16位模式,因为该模式下的地址是由16位值构成的。中断最早就是为实地址模式下的MS-DOS设计的。 • 实地址模式程序具有以下特征: • 只能寻址1MB内存 • 一次任务中只能运行一个程序(单任务) • 内存没有边界保护,因此任何应用程序都可以覆盖操作系统使用的内存 • 偏移是16位的 汇编语言
地址 FFFFF ROM BIOS F0000 保留区 C0000 文本和图形视频 B8000 VRAM 图形视频 A8000 驻留程序区 (应用程序可用) 命令行处理器的暂留部分 命令行处理器驻留部分 640K RAM DOS内核、设备驱动 软件BIOS BIOS和DOS数据 00400 中断向量表 00000 内存组织 • 在实地址模式下,地址最低的640KB内存是由操作系统和应用程序共用的,在此之上是为视频和硬件控制器保留的内存,最高端的C0000到FFFFF之间的内存是为系统ROM(只读内存)保留的。 汇编语言
重定向输入输出 • 标准输入设备(standard input device)和标准输出设备(standard output device)统称为控制台(console),控制台一般从键盘读取输入,并输出到视频显示中。 • 从命令行运行程序时可以将标准输入重定向,这使数据可以从文件或硬件端口输入而不是从键盘输入,也可以将标准输出重定向到文件、打印机或其他I/O设备中。如果没有重定向的能力,改变输入输出之前就必须修改程序。 • 重定向的例子:tree /f | sort > dir_tree.txt • 标准设备名的完整列表如下所示: 汇编语言
软件中断 • 软件中断(software interrupt)是对操作系统过程的调用。这些过程中的大多数被称为中断服务例程(interrupt service routine)或中断处理程序(interrupt hander)。中断处理程序为应用程序提供了输入输出的能力,通常被用于以下任务中: • 显示字符和字符串 • 从键盘读取字符或字符串 • 显示彩色文本 • 打开和关闭文件 • 从文件中读取数据 • 向文件中写入数据 • 设置和返回系统的时间及日期 汇编语言
INT指令 • INT(中断过程调用)指令(a)在堆栈上压入CPU的标志并(b)调用中断处理过程。在执行INT指令之前必须在寄存器中存放一个或多个参数,在最小需求的情况下,也应该在AH中存放一个数字,用来辨识需要调用的子过程。根据调用功能的不同,可能还要通过寄存器向中断传递其他不同的参数值。中断指令的格式如下: INT 中断号 • 其中的中断号是一个0到FFh之间的整数。 汇编语言
调用程序 中断处理程序 mov … int 10h add … sti cld push es . . IRET F000:F065 (3) (1) F066 (2) F067 F068 中断向量表 F000:F065 INT 10的入口地址 (4) 中断向量 • CPU使用中断向量表来处理INT指令,中断向量表是存储在内存最底端1024字节中的地址表。该表中的每一项都是一个32位的段-偏移形式的地址,该地址指向中断处理过程。表中地址的数值在不同的机器上并不相同。在程序调用INT指令时CPU采取的动作: • 步骤1:INT助记符之后的数字告诉CPU定位中断向量表中的哪个项(图中执行的是INT 10h)。 • 步骤2:CPU在堆栈上压入标志寄存器,禁止硬件中断并执行对中断向量表中存储的地址(F000:F065)的调用。 • 步骤3:(F000:F065处的)中断处理程序开始执行,直到执行IRET(中断返回)指令时结束。 • 步骤4:IRET指令使CPU在调用程序中的INT指令之后的下一条指令处恢复执行。 汇编语言
常用的中断 • 软件中断可用来调用BIOS或DOS的中断服务程序,一些常用的中断有: • INT 10h视频服务:包括控制光标位置、显示彩色文本、卷动屏幕和显示图形等过程。 • INT 16h键盘服务:包括读取键盘和检查其状态的过程。 • INT 17h打印服务:包括初始化、打印和返回打印机状态的过程。 • INT 1Ah时间服务:包括获取自计算机启动之后的时钟嘀嗒数或将该计数器设置为新值的函数。 • INT 1Ch用户定时器服务:每秒执行18.2次空过程。 • INT 21h MS-DOS服务:提供输入输出、文件处理和内存管理等的过程。也称为MS-DOS功能调用。 汇编语言
MS-DOS功能调用(INT 21h) • MS-DOS提供了许多非常易于使用的功能以便在控制台上显示文本,这些功能是MS-DOS INT 21h功能调用的一部分。INT 21h支持90多个不同的功能调用,这些调用通过在AH寄存器中放入功能号来进行区分。 • 许多功能调用都要求输入的32位参数存储在DS:DX寄存器中。数据段寄存器DS通常指向程序的数据区,如果DS的值不符合实际的要求,可以使用SEG操作符将其设置为包含要传递给INT 21h数据的段地址,下面的语句就是这种情况: • .date • inBuffer BYTE 80 DUP(?) • .code • mov ax,SEG inBuffer • mov ds,ax • mov ax,OFFSET inBuffer 汇编语言
精选的输出功能 过滤控制字符 • 本节中的所有的功能都过滤控制字符,或者说对控制字符进行解释。例如,如果向标准输出上写了一个退格符,光标就向左移动一格。下表中列出了最可能遇到的控制字符: 汇编语言
下面的几张表描述了INT 21h的几个重要的功能:功能2,功能5,功能6,功能9和功能40h。INT 21h功能2在标准输出上显示一个字符;INT 21h功能5在打印机上打印一个字符;INT 21h功能6在标准输出上显示一个未经过滤的字符;INT 21h功能9在标准输出上显示字符串(以$字符结尾的);INT 21h功能40h将若干字节的数组写入文件或设备。 • INT 21h功能2 汇编语言
INT 21h功能5 汇编语言
INT 21h功能6 汇编语言
INT 21h功能9 汇编语言
INT 21h功能40h 汇编语言
例子程序:Hello World。 汇编语言
精选的输入功能 • INT 21h功能1 汇编语言
INT 21h功能6 如果字符已经在输入缓冲区内,INT 21h功能6从标准输入上读取一个字符,如果缓冲区为空,该功能返回并设置零标志,该功能不进行等待。 汇编语言
INT 21h功能0AH从标准输入读取一个以回车结尾的字符串。如果调用了该功能,必须传递一个下面格式的输入结构(count可以在0~128之间): count=80 KEYBOARD STRUCT maxInput BYTE count ;max chars to input inputCount BYTE ? ;actual input count buffer BYTE count DUP(?) ;holds input chars KEYBOARD ENDS • maxInput域指定了用户可最多输入的字符数,包括回车键在内。退格键可用来删除字符并回移光标。用户可按下回车键或Ctrl-Break组合键结束输入。PageUp和F1等非ASCII键都被过滤掉,不会存储在缓冲区之内。在功能返回之后,inputCount域表示输入了多少字符,回车键不包括在内。 汇编语言
INT 21h功能0AH 汇编语言
INT 21h功能0Bh 汇编语言
INT 21h功能3Fh 汇编语言
如果用户输入的字符比功能调用要求得多,那么多余的字符仍然保留在输入缓冲区中。如果程序后面运行中的其他时刻又调用了该功能,程序或许不会停止以等待输入,因为缓冲区中已经包含了数据(包括标记行结束的0Dh,0Ah)。这种情况甚至可能会在独立的程序实例之间发生。为确保程序按意愿运行,在调用功能3Fh之后需要一次一个字符地清除缓冲区。如果用户输入的字符比功能调用要求得多,那么多余的字符仍然保留在输入缓冲区中。如果程序后面运行中的其他时刻又调用了该功能,程序或许不会停止以等待输入,因为缓冲区中已经包含了数据(包括标记行结束的0Dh,0Ah)。这种情况甚至可能会在独立的程序实例之间发生。为确保程序按意愿运行,在调用功能3Fh之后需要一次一个字符地清除缓冲区。 汇编语言
日期/时间功能 • INT 21h功能2Ah获取系统日期,INT 21h功能2Bh设置系统日期;INT 21h功能2Ch获取系统时间,INT 21h功能2Dh设置系统时间。 • INT 21h功能2Ah 汇编语言
INT 21h功能2Bh 汇编语言
INT 21h功能2Ch 汇编语言
INT 21h功能2Dh 汇编语言
标准MS-DOS文件I/O服务 • INT 21h文件和目录相关功能 汇编语言
文件/设备句柄 • MS-DOS和MS-Windows都使用16位的整数(称为句柄,handle)来识别文件和I/O设备。预定义的设备句柄有5个,除了句柄2(错误输出)之外的其他句柄都支持命令行重定向,这些句柄在任何时刻都是可用的: 0 键盘(标准输入) 1控制台(标准输出) 2错误输出 3辅助设备(异步) 4打印机 • 每个I/O功能都有一个共同的特点:如果失败则设置进位标志,并在AX中返回出错码。我们可以根据出错码来显示合适的提示信息。 汇编语言
INT 21h功能716Ch INT 21h功能716Ch创建新文件或打开已存在的文件,该功能允许使用扩展文件名及文件共享,文件名中可包含目录路径。 汇编语言
INT 21h功能3Eh INT 21h功能3Eh关闭一个文件的句柄。这个功能提交文件的写缓冲,将任何残留数据写入磁盘。 汇编语言
INT 21h功能42h INT 21h功能42h将已打开文件的指针移动到新的位置。当调用该功能时,AL中存放的方式代码标识了应该如何设置指针: 0相对于文件头开始的偏移 1相对于当前位置开始的偏移 2相对于文件末尾开始的偏移 汇编语言
INT 21h功能5706h INT 21h功能5706h获取文件创建的日期和时间,该时间和文件最后被修改或访问的日期和时间不一定相同。 汇编语言
精选的库例程 • Irvine16链接库中的两个过程:ReadString和WriteString。 • 例子:读取并拷贝文本文件Readfile.asm。 汇编语言
偏移: 80 81 82 83 84 85 86 87 88 89 8A 8B 0A 20 46 49 4C 45 31 2E 44 4F 43 0D 内容: Space F I L E 1 . D O C 读取MS-DOS命令行 • 我们经常用命令行向程序传递信息,假设我们需要向程序attr.exe传递文件名file1.doc,相应的MS-DOS命令行应该是: attr FILE1.DOC • 程序运行时,命令行上的任何文本都被自动存储在一个128字节的MS-DOS命令行区域中,该区域位于称为程序段前缀(PSP,program segment prefix)的偏移80h处,其中的第一个字节包含了命令行上键入的字符数目。 • 一般来说,MS-DOS存储命令或文件名后面的所有字符,但是这个规则还有一个例外:它并不保存重定向输入输出重的文件名和设备名。 汇编语言