Dos汇编的简单输入输出.

来源:互联网 发布:java long转int 溢出 编辑:程序博客网 时间:2024/05/17 00:50

Dos汇编中的输入输入通常是用中断来实现的。通常汇编教程都是把中断放到后面讲解的。这样编排虽然很科学,但是刚开始学汇编的时候会感觉艰难苦恨,程序的运行结果只能用debug查看,还不能人机交互。

这里列举几个简单的输入输出方式


1.字符输出

使用int  21h中断的02h号功能可以在屏幕输出一个字符,dl中存放要输出字符的ascii码。

如下代码将在屏幕输出一个字符“a”

          mov   ah,02h          mov   dl,'a'          int   21h

用于字符输出的还有04h,05h,06h号功能等。

04h号功能可以输出到辅助设备

05h号功能可以输出到打印机

06h号功能既可以输入也可以输出

2.字符输入

使用int  21h中断的01h号功能可以接受一个字符,al存放输入字符的ascii码。

如下代码将在等待屏幕输入一个字符

         mov   ah,01h         int   21h
此外还有07h,08h号等功能也可以接受字符输入,他们的区别是

01h号功能过滤掉控制字符,并回显

这时如果输入控制字符会显示一些出奇怪的图案

07h号功能不过滤掉控制字符,不回显

08h号功能过滤掉控制字符,不回显

这些输入功能可以暂停程序,当简易的断点使用

3.字符串的输出

使用int 21h中断的09h号功能,ds:dx为要输出字符串的地址,字符串以'$'字符作为结束标志

如下代码将"abcdefg"输出

数据段中定义字符串

str   db   'abcdefg$'
代码段中输出字符串

mov    dx,offset strmov    ah,09hint    21h
因为是以'$'作为结束标志,所以输出的字符里不可以有'$'。到Win32汇编就是用0做结束标志,所以没这个问题。不知道dos汇编有没有方法输出带'$'字符的字符串,如果没有就只能自己将每个字符依次输出了。

4.字符串的输入

使用int 21h中断的0ah号功能等待接收一个字符串,在遇到回车后输入并回显。同样dx:ds为一个存储字符串的缓冲区。

缓冲取要求第一个字节为缓冲区的最大容量,第二个字节在接收到字符串后将放置实际输入字符串的大小,字符串的内容从第三字节开始。

如下代码等待接收一个字符串

在数据段中定义一个缓冲区

str   db   64,?,64 dup('$')
在代码段中等待接收

mov   dx,offset strmov   ah,0ahint   21h

接收到的字符串没有结束标志,如果接收后直接用09h号功能输出会看到好多乱码。

所以若要用09号功能输出可以在缓冲区初始化时在缓冲区里填充'$',可是如果这个这个缓冲区要多次接收长度不等的字符串最好每次接收前将缓冲区初始化一遍,以免前一个字符串将'$'覆盖了一部分。也可以通过缓冲区第二字节的数据找到字符串末尾,将后面一个字节置为'$'。

另外虽然按回车键接收,但不会换行,需在接收后自行换行,以免回显内容被后面的输入内容覆盖。


汇编好像没有格式化输出之类的中断功能什么的,只能自己用循环取余数转换为字符输出了。


如过想要更复杂的输入输出操作可以使用bios中断中的int 10h(显示服务),int 16h(键盘服务)。




0 0