ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MS-DOS,PC-BIOS调用

2021-06-22 14:03:12  阅读:219  来源: 互联网

标签:code int ah mov BIOS MS ax DOS 21h


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,返回当前换挡状态

标签:code,int,ah,mov,BIOS,MS,ax,DOS,21h
来源: https://blog.csdn.net/azraelxuemo/article/details/118105701

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有