BIOS或DOS调用可按以下五步进行
(1)功能号装入AH
(2)参数装入其他寄存器
(3)int n调用中断
(4)检查返回值
BIOS更靠近硬件,处理速度更快
-
DOS调用
-
输入字符功能(AH=01h/int 21h)
-
键盘单个字符输入的功能
-
mov ah,01h int 21h;保存在al中 ;ex:从键盘输入一个字符并保存到变量char中 data segment char db '?' data ends stack1 segment stack dw 100h dup(?) stack1 ends code segment assume cs:code,ds:data,ss:stack1 main: mov ax,data mov ds,ax mov ah,01h int 21h mov char ,al mov ah,4ch int 21h code ends end main
-
-
输出字符功能(ah=02h/int 21h)
-
mov dl,char;char代表字符码 mov ah,02h int 21h ;输出一个K code segment assume cs:code main: mov dl,'K' mov ah,02h int 21h mov ah,4ch int 21h code ends end main
-
-
输出字符串功能(09h/21h)
-
该字符串必须以$结尾
-
mov ax,字符串段地址 mov ds,ax mov dx,offset char;字符串偏移地址 mov ah,09h int 21h ;输出hello world data segment str db 'hello world!','$' data ends code segment assume cs:code,ds:data main: mov ax,data mov ds,ax mov dx,offset str mov ah,09h int 21h mov ah,4ch int 21h code ends end main
-
-
输入字符串功能(0Ah/21h)
-
应该建立一个输入缓冲区,第0个字节放能保存的最多字符数(含回车),由用户自己设置,如果输入的字符数超过用户设置的最多字符数,系统会发出响铃声并且光标不再向右移动,输入缓冲区的第1个字节存放用户本次功能调用时实际输入的字符数不含回车符,这个数据由dos中断返回时自动填写,用户调用时不需要填写,输入缓冲区的第二个字节开始按字节存放从键盘输入的数据知道用户输入回车为止,这时回车0Dh还要占用一个字节,因此整个缓冲区长度为最多字符数(包括回车键在内)加2
-
mov ax,缓冲区段地址 mov ds,ax mov dx,缓冲区偏移地址 mov ah,0Ah int 21h data segment buf db 25,0,25 dup(?);第一个25表示最多25个(含回车),第二个表示实际输入的最后由系统覆盖,第三个为我们实际的缓冲区 data ends code segment assume cs:code,ds:data main: mov ax,data mov ds,ax mov ah,0Ah mov dx,offset buf int 21h mov ah,4ch int 21h code ends end main
-
-
终止程序功能(4Ch/21h)
-
-
BIOS调用
-
int 10h–视频中断
-
文本模式
-
每个字符用两个字节表示,一个为ASCIi,另一个为属性,包括背景色,前景色和闪烁状态
-
7 6 5 4 3 2 1 0
-
闪烁 背景 亮度 前景色
-
0正常 000黑 0正常 RGB
-
1闪烁 111白 1加强
-
一行可以显示80个字符,共25行,总共是2000个字符,由于每个字符需要两个字节,因此需要4000个字节的显示缓冲区,在文本模式下,显卡可以使用的显存的起始位置时B800:0000,要在Y行X列显示一个字符,偏移地址为y802+x*2
-
比如要在10行10列写入白底黑字的字符B,偏移地址为654写入’B’,在655写入42h
-
;把整个屏幕填满蓝底白字的字符'A' code segment assume cs:code main: mov ax,0B800h mov es,ax;显存的段地址 xor di,di;di偏移地址 mov cx,80*25 mov ah,17h;1为蓝色背景,7代表白字 mov al,'A' cld rep stosw mov ah,0 int 16h;等待输入一个键 mov ah,4ch int 21h code ends end main
-
-
图形模式
-
从文本模式切换到图像模式或从图形模式切换回文本模式均需要调用int 10h的00h号功能,al=视频模式号,al=03h代表80*25的文本模式,al=13h代表320*200*256色图形模式
-
每个像素占用1字节的显存,坐标(x,y)处像素对应的显存偏移地址计算公式为320*y+x
-
显存的段地址为0A000h
-
;显示一个41*41的红色方块 code segment main: jmp begin i dw 0 begin: mov ax,0013h; int 10h;切换到图形模式 mov ax,0A000h mov es,ax mov di,(100-20)*320+160-20;(160-20,100-20) mov [i],41 netxt_row: push di mov al,4;color red mov cx,41;dots=41 next_dot: mov es:[di],al add di,1 sub cx,1 jnz next_dot pop di add di,320 sub i,1 jnz next_row mov ah,0 int 16h;等待一个键盘输入 mov ax,0003h int 10h;切换回文本模式 mov ah,4ch int 21h code ends end main
-
-
-
int 13h–磁盘中断
- 调用中断前需要设置下列参数
- AH=要执行的操作;读写,检验格式化
- 00进行硬件复位
- 01,读取磁盘操作的状态
- 02h,执行读磁盘操作状态,把某一磁道上的若干个扇区中的数据读取到内存,要求预先把ES:BX设置为I/O的地址
- AL=扇区数
- CH=磁道号
- CL=起始的扇区号
- DH=磁头号,如果是软盘,值为0或1
- DL=驱动器号,0=驱动器A,1=驱动器B,80h=驱动器C
- ES:BX=I/O缓冲区的地址
-
int 16h–键盘中断
- AH=0,读键盘,al=ascii码,ah=扫描码
- ah=1,检测键盘,zf=1无码可读,zf=0有码可读,键码返回ax中
- ah=2,返回当前换挡状态
-