汇编 DOS的中断调用 INT 21H

DOS系统功能调用

这个汇编指令是用于提供DOS系统功能调用。

它是由DOS提供的一组实现特殊功能的子程序供程序猿在编写自己的程序时调用,以减轻编程的工作量。

分两种,

re=view">DOS系统功能调用BIOS中断调用

链接里都是一些经常使用的内容,大家能够自己去百度,一定比我这里给出的全面非常多,有那种DOS系统功能调用表

调用步骤大致

  • (1)系统功能号送到寄存器AH中。
  • (2)入口參数送到指定的寄存器中;
  • (3)用INT 21H指令运行功能调用;
  • (4)依据出口參数分析功能调用运行情况。

    以下归纳5个在汇编中经常使用的INT 21H系统功能调用。

AH 功能 入口參数 出口參数
4CH 返回DOS
1 键盘输入一个字符到AL中 AL=字符
2 输出DL寄存器的字符到显示器 DL(存放一个字符)
9 输出一个以“$”结尾的字符串到显示器 DS:字符串所在的段地址 DX:字符串首地址
0AH 从键盘输入一个字符串到指定缓冲区 DS:缓冲区所在的段地址 DX:缓冲区首地址 缓冲区对应位置

实例

带返回码的结束(AH=4CH)

功能:返回DOS

入口參数:无

调用方法

       MOV    AH,4CH
       INT      21H

通过4CH功能调用能够结束当前正在运行的程序,返回DOS系统,一般用于汇编程序的结束位置。

键盘输入一个字符(AH=1)

功能:从键盘输入一个字符到AL中,AL中为该字符的ASCII码。

入口參数:无

调用方法

       MOV    AH,1

       INT      21H

运行完上面的系统调用后,出现提示输入光标,从键盘输入一个字符并保存其ASIIC码到AL寄存器中。

<样例>:交互式程序中用户按下数字键1,2,3。程序转入对应的服务子程序,若按下其它键则会继续等待。

KEY:  MOV  AH,1
      INT  21H  ;系统等待输入一个字符
      CMP  AL,‘1‘
      JE   ONE ;假设输入字符为1则跳到标识符ONE处运行
      CMP  AL,‘2‘
      JE   TWO ;如上解析
      CMP  AL,‘3‘
      JE   THREE
      JMP  KEY ;假设不是1、2、3则继续输入字符
ONE:   ......
TWO:   ......
THREE: ...... 

输出显示一个字符(AH=2)

功能:输出DL寄存器中的字符到显示器。

入口參数:被输出显示的字符或者字符ASCII码送到DL寄存器中

调用方法

        MOV       DL,字符码
        MOV       AH,2
        INT         21H

运行完上面的调用后,显示器显示出DL中的字符。

         MOV  DL,‘6‘  (也能够写成6的ASCII码36H,既:MOV   DL,36H)
         MOV   AH,2
         INT     21H

调用结果在屏幕上光标位置处显示6。

输出一个字符串(AH=9)

功能:输出显示一个以”$”字符结尾的字符串到显示器。

入口參数:DX=字符串偏移地址;DS=字符串的段地址

调用方法

       MOV     AX,字符串所在的段地址
       MOV     DS,AX
       MOV     DX,字符串的首址偏移地址
       MOV     AH,9
       INT        21H

运行上面调用,输出以DS:DX为首地址,”"为结尾的字符串到显示器中。若要在显示字符串光标自动回车换行,则在"”字符前面加上0DH(回车),0AH(换行)字符。

<样例>:在屏幕上显示“HOW DO YOU DO?”字符串。而且光标回车换行。

DATA SEGMENT
  STR1 DB ‘HOW DU YOU DO?‘,0DH,0AH,‘$‘
DATA ENDS

CODE SEGMENT
  ASSUME CS:CODE,DS:DATA
START:
      MOV AX,DATA
      MOV DS,AX
      MOV DX,OFFSET STR1;字符串首偏移地址放到DX中
      MOV AH,9
      NT 21H;输出字符串

      MOV AH,4CH
      INT 21H
CODE ENDS
 END START

从键盘输入一个字符串到缓冲区(AH=0AH)

功能:从键盘输入一串ASCII码字符到缓冲区,输入结束为缓冲区的个数或者“回车”字符。

入口參数:DX=缓冲区首偏移地址;DS=缓冲区段地址

调用方法

        MOV      AX,缓冲区的首址的段地址
        MOV      DS,AX
        MOV       DX,缓冲区的首址的偏移地址
        MOV      AH,0AH
        INT        21H

运行完上面调用,将从键盘接受字符串送到内存的输入缓冲区(由DS:DX指定缓冲区),要求预先定义一个缓冲区,缓冲区的第一个字节指定容纳的最大字符个数,由用户给出;第二个字节存放实际的最大字符个数,由系统最后添入;从第三个字节開始存放从键盘接受的字符,直到ENTER键结束。

DATA SEGMENT
    BUF   DB   20,         ;存放最大字符个数20个
            DB   ?

,         ;存放实际输入字符个数
            DB   20 DUP(?

)  ;存放输入字符
DATA ENDS
CODE SEGMENT
  ASSUME CS:CODE,DS:DATA
START:
   MOV   AX,DATA   ;缓冲区所在段基址
   MOV  DS,AX
   LEA  DX,BUF    ;缓冲区首址偏移地址
   MOV  AH,0AH
   INT  21H

   MOV  AH   4CH
   INT  21H
CODE ENDS
     END  START    
时间: 2024-10-13 14:14:53

汇编 DOS的中断调用 INT 21H的相关文章

DOS功能的调用

DOS功能的调用:主要包含三方面的子程序:设备驱动(基本I/O),文件管理和其他(包括内存管理,自取时间,自取终端向量,总之程序等)随着DOS版本的升级,这种DOS功能调用的子程序数量也在不断的增加,功能恶搞更加完备,使用也更加方便 调用的方法 可以按照下面方法调用DOS功能 [1]根据需调用的功能调用准备入口参数,有部分调用是不需要入口参数的,但是大部分的功能调用需要入口参数,在调用前应该准备好入口参数 [2]把功能调用号送到AH [3]发软中断指令INT 21H 基本的I/O的调用 1:带回

16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.asm  生成.obj文件 ;2.masm lib.asm  生成.obj文件 ;3.link main.obj lib.obj 生成.exe文件 ;第二种,编译方法 ;1.masm main.asm  生成.obj文件 ;2.masm 16lib.asm  生成.obj文件 ;3.lib 16lib.

int 21h 汇编

INT 21H 指令说明及使用方法 转自http://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html 很多初学汇编语言的同学可能会对INT 21H这条指令感到困惑,不知道是什么意思,下面就以一段简单的程序为大家讲解: 例如:需要键盘输入,并且回显. AH的值需要查表取得,表在下面 指令:MOV AH,01 INT 21H 通过这样两条指令,输入的字符就会被存储在AL中. 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参

X86汇编7.内部中断

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时. 依据中断来源,中断可以分为内部中断,和外部中断. 1.内部中断的产生当CPU发生下列事情后,会产生中断:(1)除法错误,中断号:0(2)单步执行,中断号:1(3)执行info指令,中断号:4(4)执行int指令,中断号:int 指令后面跟随的立即数 CPU收到中断信息后,需要立即对中断进

80x86保护模式下IDT和中断调用过程分析

1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT类似,IDT也是由8字节长度的描述符组成.IDT空描述符的存在标志位必须是0.IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置. LIDT指令可以把内存中的限长值和基地址操作数加载到IDTR寄存器中,该指令仅能由当前特权级CPL是0的代码执行,通常被用于创建IDT时的操作系统初始化代码中.SIDT作用相反,但可以在任何特权级执行. 2.IDT描述符 IDT表中可以存

Linux汇编与C互相调用

一.简介 C语言调用汇编有两种方式:1.通过内嵌汇编  2.通过编译链接. 二.基础知识 对于C和汇编语言的接口主要有两个问题需要解决 1.调用者与被调用者的参数传递 正常的,定义一个函数总是希望它完成某些功能,一个毫无用处的函数将毫无意义.这些功能有常常是更大的功能的一部分,而函数完成这些功能或多或少都要与外界联系(一个完全不与外界联系的函数也是一个毫无意义的函数)(延时函数也要消耗时间,时间也属于外界的一种资源),比如要传递一些数据给其处理,处理过后返回处理的结果.这种数据的传递可以形象的通

DOS系统功能调用表(INT 21H)

AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘输入(无回显)检测Ctrl-Break AL=输入字符 09 显示字符串 DS:DX=串地址'$'结束字符串

汇编|使用10h中断来显示字符串

特么这个问题困扰了我好久,毕竟是个OS newbie,还没有汇编的基础. 在前天的加载loader的实验中,老师要求显示字符串,但是给的代码只是显示一个字符. 愚蠢的我实在没办法,最后为了按期完成实验,只能一个个字符地输出,呀真是羞耻. 好了,趁着清明假期,花了几个小时终于弄懂了. 下面进入正题! 前戏是先对boot.asm和loader.asm编译: nasm -o boot.bin boot.asm nasm -o loader.bin loader.asm 然后把boot.bin写入软盘a

X86汇编8.外部中断

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时. 1.端口的读写在PC系统中,除和CPU通过总线相连的芯片(内存芯片)之外,还有3类芯片:(1)各接口卡(网卡.显卡)上的接口芯片,他们控制接口卡进行工作(2)主板上的接口芯片,CPU通过它们对部分外省进行访问(3)其他芯片,用来存储相关的系统信息,或进行相关的输入.输出处理这些芯片都有一