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
代表函数编号.
例如 :
INT 0x10用于屏幕操作
INT 0x13用于存储(HDD和FDD)
您可以在此处找到所有这些功能:中断跳转表
但这些只是BIOS INT,可以在启动时由OS重写.例如,Windows INT 0x21
用于用户空间和内核空间之间的通信; 基于Linux的使用INT 0x80
.另请参见Linux系统调用表
在你的代码中:
mov ax, 3
)表示:将视频模式设置为TextMode 80x25字符和16种颜色.小智 5
关于你的这个问题:
我们什么时候应该使用它们中的任何一个,为了什么?
可能永远不会。
这些 BIOS 中断主要由 MS-DOS 应用程序使用,今天基本上已经过时。它们在运行时不适用于在任何现代操作系统上运行的应用程序,因此您可能永远不会使用它们。(例外情况可能包括,如果您正在开发某些在引导过程的早期运行的软件,例如引导加载程序、硬件设备的固件,或者您正在开发 BIOS 本身。)