区别:INT 10H,INT 16H,INT 21H

Mar*_*iah 1 binary assembly emulation x86-16

有人可以用汇编语言向我解释: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
Run Code Online (Sandbox Code Playgroud)

Gab*_*aru 10

首先INT是中断,与int数据类型无关.

每个INT代表一个函数系列,通常AH代表函数编号.

例如 :

  1. INT 0x10用于屏幕操作

    • AH = 0x00 - >设置视频模式
    • AX = 0x1003 - >设置闪烁模式
    • AH = 0x13 - >写字符串
    • AH = 0x03 - >获取光标位置
  2. INT 0x13用于存储(HDD和FDD)

    • AH = 0x42 - > DISK READ
    • AH = 0x43 - > DISK WRITE
  3. INT 0x16用于键盘控制和读取:
    • AH = 0x00 - > GetKey
    • AH = 0x03 - >设置打字速率和延迟

您可以在此处找到所有这些功能:中断跳转表

但这些只是BIOS INT,可以在启动时由OS重写.例如,Windows INT 0x21用于用户空间和内核空间之间的通信; 基于Linux的使用INT 0x80.另请参见Linux系统调用表

在你的代码中:

  • INT 0x10,AH = 0x00,AL = 3(mov ax, 3)表示:将视频模式设置为TextMode 80x25字符和16种颜色.
  • INT 0x10,AX = 0x1003表示:TOGGLE INTENSITY/BLINKING BIT启用背景强度

  • 上次我检查 Windows 使用“int 0x2e”进行系统调用。入口点“int 0x21”用于 DOS 调用。 (2认同)

小智 5

关于你的这个问题:

我们什么时候应该使用它们中的任何一个,为了什么?

可能永远不会。

这些 BIOS 中断主要由 MS-DOS 应用程序使用,今天基本上已经过时。它们在运行时不适用于在任何现代操作系统上运行的应用程序,因此您可能永远不会使用它们。(例外情况可能包括,如果您正在开发某些在引导过程的早期运行的软件,例如引导加载程序、硬件设备的固件,或者您正在开发 BIOS 本身。)