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

时间:2015-05-12 09:54:06

标签: assembly binary 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

3 个答案:

答案 0 :(得分: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 - >设置打字速率和延迟
  4. 您可以在此处找到所有这些功能:Interrupt Jump Table

    但这些只是BIOS INT,可以在启动时由OS重写。例如,Windows使用INT 0x21进行用户空间和内核空间之间的通信;基于Linux的使用INT 0x80。另请参阅Linux System Call Table

    在您的代码中:

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

答案 1 :(得分:4)

关于你的这个问题:

  

我们何时应该使用它们中的任何一个以及用于什么?

可能永远不会。

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

答案 2 :(得分:0)

INT 这里代表INTERRUPT,它有功能模式,如00,01,02等等,INT 10h用于图形和视频模式初始化,{{1}用于设置键盘笔划。