之间的差异: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代表函数编号。

例如:

  1. INT 0x10 用于屏幕操作
  • AH=0x00 -> 设置视频模式
  • AX=0x1003 -> 设置闪烁模式
  • AH=0x13 -> 写入字符串
  • AH=0x03 -> 获取光标位置
  1. INT 0x13 用于存储(HDD 和 FDD)
  • AH=0x42 -> 磁盘读取
  • AH=0x43 -> 磁盘写入
  1. 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 本身。)