MS-DOS,PC-BIOS调用

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,返回当前换挡状态
上一篇:来看看几个数据库连接池的配置参数


下一篇:mybatis源码学习