assembly 差异:中间10H、中间16H、中间21H

s8vozzvw  于 2022-12-29  发布在  其他
关注(0)|答案(3)|浏览(224)

有谁能给我解释一下以下两者之间的区别吗?汇编语言中的INT 10H,INT 16H,INT 21H?我们应该在什么时候使用它们中的任何一个,用于什么?
例如:在这个简单的代码中,打印"Hello,World!",为什么我们在第四行使用int10h,为什么我们在最后一行之前使用int16h?

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
k2arahey

k2arahey1#

首先,INT表示中断,与int数据类型无关。
每个INT代表一个函数族,通常AH寄存器中存储的值代表函数编号。
例如:

  1. INT 0x10用于屏幕操作
  • AH = 0x00-〉设置视频模式
  • AX = 0x1003-〉设置 Flink 模式
  • AH = 0x13-〉写入字符串
  • AH = 0x03-〉获取光标位置
  1. INT 0x13用于存储(HDD和FDD)
  • AH = 0x42-〉磁盘读取
  • AH = 0x43-〉磁盘写入
  1. INT 0x16用于键盘控制并读取:
  • AH = 0x00-〉获取密钥
  • AH = 0x03-〉设置打印速率和延迟

您可以在这里找到所有这些函数:Interrupt Jump Table
但这些只是BIOS INT,OS在启动时可以重写,比如Windows使用INT 0x2E进行用户空间和内核空间的通信;基于Linux的使用INT 0x80。另请参见Linux System Call Table
在您的代码中:

  • 当AH = 0x00且AL = 3(mov ax, 3)时,INT 0x10表示:设置视频模式为文本模式80x25字符和16色。
  • INT 0x10(AX = 0x1003)表示:切换强度/ Flink 位至背景强度启用
nzrxty8p

nzrxty8p2#

关于你的这个问题:
我们应该在什么时候使用它们?用于什么目的?
可能永远不会。
这些BIOS中断主要由MS-DOS应用程序使用,现在基本上已经过时了。在任何现代操作系统上运行的应用程序在运行时都不能使用它们,所以你可能永远不会使用它们。(例外情况可能包括,如果您正在开发在引导过程中非常早运行的某些软件,如引导加载程序、硬件设备的固件,或者如果您正在开发BIOS本身。)

6tqwzwtp

6tqwzwtp3#

这里 INT 代表INTERRUPT,有00、01、02等功能模式,INT 10h用于图形和视频模式初始化,INT 16h用于设置键盘敲击。

相关问题