有谁能给我解释一下以下两者之间的区别吗?汇编语言中的INT 10H,INT 16H,INT 21H?我们应该在什么时候使用它们中的任何一个,用于什么?
例如:在这个简单的代码中,打印"Hello,World!",为什么我们在第四行使用int10h,为什么我们在最后一行之前使用int16h?
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
3条答案
按热度按时间k2arahey1#
首先,
INT
表示中断,与int
数据类型无关。每个
INT
代表一个函数族,通常AH
寄存器中存储的值代表函数编号。例如:
您可以在这里找到所有这些函数:Interrupt Jump Table
但这些只是BIOS INT,OS在启动时可以重写,比如Windows使用
INT 0x2E
进行用户空间和内核空间的通信;基于Linux的使用INT 0x80
。另请参见Linux System Call Table在您的代码中:
mov ax, 3
)时,INT 0x10表示:设置视频模式为文本模式80x25字符和16色。nzrxty8p2#
关于你的这个问题:
我们应该在什么时候使用它们?用于什么目的?
可能永远不会。
这些BIOS中断主要由MS-DOS应用程序使用,现在基本上已经过时了。在任何现代操作系统上运行的应用程序在运行时都不能使用它们,所以你可能永远不会使用它们。(例外情况可能包括,如果您正在开发在引导过程中非常早运行的某些软件,如引导加载程序、硬件设备的固件,或者如果您正在开发BIOS本身。)
6tqwzwtp3#
这里 INT 代表INTERRUPT,有00、01、02等功能模式,
INT 10h
用于图形和视频模式初始化,INT 16h
用于设置键盘敲击。