在8086汇编中,会用到很多的中断调用,21h中断是最常用的,这里总结下21h的函数功能码,以及一些小的example code。
下图是int 21h DOS函数码。包括控制台读写,获取系统信息,文件目录管理等。
(int 21h DOS功能码)
01 Read character from STDIN
input: AH = 01
output: AL = read character
01功能码从标准输入中读取一个字符,读取的字符存放到寄存器AL中。
; test.asm, run in dosbox
; assembly: masm test.asm
; link : link test.obj
; run : test.exe
data segment
data ends
code segment
assume ds:data,cs:code
main:
mov ax, data
mov ds, ax
mov ah, 01h
int 21h
mov ah, 4ch
int 21h
code ends
end main
汇编,链接上面的代码,然后运行,会发现光标闪动,输入一个字符后,程序结束。输入的字符存到寄存器AL中。
02 WRITE CHARACTER TO STANDARD OUTPUT
input: DL = character to write
return: AL = last character output
寄存器DL保存要输出到标准输出的字符,AL保存最后一个输出的字符。
; test.asm, run in dosbox
; assembly: masm test.asm
; link : link test.obj
; run : test.exe
data segment
data ends
code segment
assume ds:data,cs:code
main:
mov ax, data
mov ds, ax
mov dl, 'a'
mov ah, 02h
int 21h
mov ah, 4ch
int 21h
code ends
end main
在上面的代码中,使用mov指令在dl中存放了字符'a',然后ah存放2,调用21h,会打印字符'a'.
09 WRITE STRING TO STANDARD OUTPUT
input: DS:DX = '$' - terminated string
return: AL = 24h
09号功能码打印字符串,字符串以$结尾。
; test.asm, run in dosbox
; assembly: masm test.asm
; link : link test.obj
; run : test.exe
data segment
buf db "hello,world!",'$'
data ends
code segment
assume ds:data,cs:code
main:
mov ax, data
mov ds, ax
mov ah, 09h
lea dx, buf
int 21h
mov ah, 4ch
int 21h
code ends
end main
上面的代码中,在数据段定义了一个字符串buf,该字符串以$结尾。
lea指令将buf的地址存放到寄存器DX中,最后调用21h。
0A BRFFERED INPUT
input: DS:DX = string
0A功能码输入字符串,字符串地址存放到寄存器DX中。
; test.asm, run in dosbox
; assembly: masm test.asm
; link : link test.obj
; run : test.exe
data segment
buf db 20 dup('$')
data ends
code segment
assume ds:data,cs:code
main:
mov ax, data
mov ds, ax
mov ah, 0Ah
lea dx, buf
int 21h
mov ah, 4ch
int 21h
code ends
end main
上面的代码中将buf的地址存放到寄存器DX中,然后调用21h中断。