之间的差异:INT 10H、INT 16H、INT 21H
Differences between: INT 10H , INT 16H, INT 21H
谁能给我解释一下汇编语言中 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
首先INT
表示中断,与int
数据类型无关
每个INT
代表一个函数族,其中通常AH
代表函数编号。
例如:
- INT 0x10 用于屏幕操作
- AH=0x00 -> 设置视频模式
- AX=0x1003 -> 设置闪烁模式
- AH=0x13 -> 写入字符串
- AH=0x03 -> 获取光标位置
- INT 0x13 用于存储(HDD 和 FDD)
- AH=0x42 -> 磁盘读取
- AH=0x43 -> 磁盘写入
- INT 0x16 为键盘控制,读取:
- AH=0x00 -> GetKey
- AH=0x03 -> 设置打字速率和延迟
您可以在这里找到所有这些函数:Interrupt Jump Table
但这些只是BIOS INT,可以在启动时通过OS改写。例如,Windows 使用 INT 0x2E
用于用户 space 和内核 space 之间的通信; Linux-基础使用INT 0x80
。另见 Linux System Call Table
在您的代码中:
- INT 0x10 with AH = 0x00 and AL = 3 (
mov ax, 3
) 表示:将视频模式设置为 TextMode 80x25 个字符和 16 种颜色。
- INT 0x10 with AX = 0x1003 表示:切换INTENSITY/BLINKING BIT 到背景强度启用
INT这里代表INTERRUPT,有00,01,02等Function Mode,INT 10h
用于图形和视频模式初始化, INT 16h
用于设置键盘笔画。
关于你这个问题:
When should we use any of them and for what?
可能永远不会。
这些 BIOS 中断主要由 MS-DOS 应用程序使用,如今已基本过时。它们在 运行 时间对任何现代操作系统上的应用程序 运行ning 不可用,因此您可能永远不会使用它们。 (例外情况可能包括,如果您正在开发某些 运行 在启动过程中很早的软件,例如引导加载程序、硬件设备的固件,或者如果您正在开发 BIOS 本身。)
谁能给我解释一下汇编语言中 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
首先INT
表示中断,与int
数据类型无关
每个INT
代表一个函数族,其中通常AH
代表函数编号。
例如:
- INT 0x10 用于屏幕操作
- AH=0x00 -> 设置视频模式
- AX=0x1003 -> 设置闪烁模式
- AH=0x13 -> 写入字符串
- AH=0x03 -> 获取光标位置
- INT 0x13 用于存储(HDD 和 FDD)
- AH=0x42 -> 磁盘读取
- AH=0x43 -> 磁盘写入
- INT 0x16 为键盘控制,读取:
- AH=0x00 -> GetKey
- AH=0x03 -> 设置打字速率和延迟
您可以在这里找到所有这些函数:Interrupt Jump Table
但这些只是BIOS INT,可以在启动时通过OS改写。例如,Windows 使用 INT 0x2E
用于用户 space 和内核 space 之间的通信; Linux-基础使用INT 0x80
。另见 Linux System Call Table
在您的代码中:
- INT 0x10 with AH = 0x00 and AL = 3 (
mov ax, 3
) 表示:将视频模式设置为 TextMode 80x25 个字符和 16 种颜色。 - INT 0x10 with AX = 0x1003 表示:切换INTENSITY/BLINKING BIT 到背景强度启用
INT这里代表INTERRUPT,有00,01,02等Function Mode,INT 10h
用于图形和视频模式初始化, INT 16h
用于设置键盘笔画。
关于你这个问题:
When should we use any of them and for what?
可能永远不会。
这些 BIOS 中断主要由 MS-DOS 应用程序使用,如今已基本过时。它们在 运行 时间对任何现代操作系统上的应用程序 运行ning 不可用,因此您可能永远不会使用它们。 (例外情况可能包括,如果您正在开发某些 运行 在启动过程中很早的软件,例如引导加载程序、硬件设备的固件,或者如果您正在开发 BIOS 本身。)