有人可以用汇编语言向我解释:INT 10H,INT 16H,INT 21H之间的区别吗?我们什么时候应该使用它们中的任何一个?
例如:在这个简单的代码中打印“Hello,World!” 为什么我们在第四行使用int 10h? 为什么我们在最后一行之前使用int 16h?
name "hi-world"
org 100h
mov ax, 3
int 10h
mov ax, 1003h
mov bx, 0
int 10h
mov ax, 0b800h
mov ds, ax
mov [02h], 'H'
mov [04h], 'e'
mov [06h], 'l'
mov [08h], 'l'
mov [0ah], 'o'
mov [0ch], ','
mov [0eh], 'W'
mov [10h], 'o'
mov [12h], 'r'
mov [14h], 'l'
mov [16h], 'd'
mov [18h], '!'
mov cx, 12 ; number of characters.
mov di, 03h ; start from byte after 'h'
c: mov [di], 11101100b
add di, 2 ; skip over next ascii code in vga memory.
loop c
; wait for any key press:
mov ah, 0
int 16h
ret
答案 0 :(得分:10)
首先INT
表示中断,与int
数据类型无关。
每个INT
代表一个函数系列,通常AH
表示函数编号。
例如:
INT 0x10用于屏幕操作
INT 0x13用于存储(HDD和FDD)
您可以在此处找到所有这些功能:Interrupt Jump Table
但这些只是BIOS INT,可以在启动时由OS重写。例如,Windows使用INT 0x21
进行用户空间和内核空间之间的通信;基于Linux的使用INT 0x80
。另请参阅Linux System Call Table
在您的代码中:
mov ax, 3
)表示:将视频模式设置为TextMode 80x25字符和16种颜色。答案 1 :(得分:4)
关于你的这个问题:
我们何时应该使用它们中的任何一个以及用于什么?
可能永远不会。
这些BIOS中断主要由MS-DOS应用程序使用,现在基本上已经过时了。它们在运行时不可用于在任何现代操作系统上运行的应用程序,因此您可能永远不会使用它们。 (例外情况可能包括:如果您正在开发在引导过程中很早就运行的某些软件,例如引导加载程序,硬件设备的固件,或者您自己正在开发BIOS。)
答案 2 :(得分:0)
INT 这里代表INTERRUPT,它有功能模式,如00,01,02等等,INT 10h
用于图形和视频模式初始化,{{1}用于设置键盘笔划。