x86汇编语言之内中断

859 阅读10分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

概述

  1. 中断

    顾名思义,程序运行到一半暂时断开,官方一点说就是,由于软件或者硬件信号,使得cpu暂停当前任务,转而执行另一段子程序

    可以形象理解为游戏中暂时搁置主线任务临时去完成支线任务

    中断的分类:

    • **外中断 (硬中断):**由外部设备(比如网卡,或者硬盘 键盘 鼠标)引发的中断,比如当网卡收到数据包的时候,就会发出一个中断

    • **内中断(软中断):**由执行的中断指令产生的,可以通过程序控制触发

    我们接下来要学习的是内中断知识,如果我们想要通过代码发出一个中断,那么需要使用中断指令int

    int 21h ;执行中断码为21H的中断指令 
    

    cpu接收到中断信号后,暂停当前正在执行的指令,临时去执行中断码对应的内容

    中断码不止一个,每个码代表着不同的含义,部分中断码列表如下:

    中断功能入口参数出口参数
    INT16键盘输入AH=0H读键盘 AH=10读扩展键盘AH=键盘扫描码 AL=字符ascii码
    INT20程序正常退出CS=PSP段地址
    INT21系统功能调用AH=功能号
    INT22程序结束处理
    INT23Ctrl-Break处理AL=0(忽略)
    INT24严重错误处理AL=驱动器号AL=1(重试)AL=2(通过INT 23H终止)Cy=1出错
    INT25绝对磁盘读CX=读入扇区数DX=起始逻辑扇区数DS:BX=缓冲区地址AL=驱动器号Cy=0正确
    INT26绝对磁盘写CX=写盘扇区数DX=起始逻辑扇区数DS:BX=缓冲区地址
    INT27驻留退出CS=PSP段地址DX=程序末地址+1

    二、DOS功能调用

    功能号在AH中,并设好其余的入口参数,向DOS发出INT21H命令,最后获得出口参数。

    调用号功能入口参数出口参数
    00H程序终止CS=PSP段地址
    01H键盘输入字符AL=输入的字符
    02H显示输出DL=显示的字符
    03H串行设备输入AL=输入的字符
    04H串行设备输出DL=输出的字符
    05H打印输出DL=输出的字符
    06H直接控制台I/ODL=0FFH(输入请求)DL=字符(输出请求)AL=输入的字符
    07H直接控制台I/O(不显示输入)AL=输入的字符
    08H键盘输入字符(无回显)AL=输入的字符
    09H显示字符串DS:DX=缓冲区首址
    0AH输入字符串DS:DX=缓冲区首址
    0BH检查标准输入状态AL=00无按键AL=0FFH有按键
    0CH清除输入缓冲区并执行指定的标准输入功能AL=功能号(01/06/07/08/0AH)DS:DX=缓冲区(0AH功能)AL=输入的数据(功能01/06/07/08)
    0DH初始化磁盘状态
    0EH选择缺省的驱动器DL=驱动器号(0=A,1=B..)AL=逻辑驱动器数
    0FH打开文件DS:DX=未打开的FCB首址AL=00成功,0FFH失败
    10H关闭文件DS:DX=打开的FCB首址AL=00成功,0FFH失败
    11H查找第一匹配目录DS:DX=未打开的FCB首址AL=00成功,0FFH失败
    12H查找下一匹配目录DS:DX=未打开的FCB首址AL=00成功,0FFH失败
    13H删除文件DS:DX=未打开的FCB首址AL=00成功,0FFH失败
    14H顺序读DS:DX=打开的FCB首址AL=00成功,01文件结束02缓冲区太小03缓冲区不满
    15H顺序写DS:DX=打开的FCB首址AL=00成功,01盘满02缓冲区太小
    16H创建文件DS:DX=未打开的FCB首址AL=00成功0FFH目录区满
    17H文件换名DS:DX=被修改的FCB首址AL=00成功,0FFH未找到目录项或文件重名
    *18H保留未用
    19H取缺省驱动器号AL=驱动器号(0=A,1=B..)
    1AH设置磁盘缓冲区DTADS:DX=磁盘缓冲区首址
    *1BH取缺省驱动器的磁盘格式信息AL=每簇的扇区数CX=每扇区的字节数DX=数据区总簇数-1DS:BX=介质描述字节
    *1CH取指定驱动器的磁盘格式信息DL=驱动器号(0=缺省,1=A..)AL=每簇的扇区数CX=每扇区的字节数DX=数据区总簇数-1DS:BX=介质描述字节
    *1DH保留未用
    *1EH保留未用
    *1FH取缺省驱动器的DPBDS:BX=DPB首址
    *20H保留未用
    21H随机读一个记录DS:DX=打开的FCB首址AL=00成功,01文件结束02缓冲区太小03缓冲区不满
    22H随机写一个记录DS:DX=打开的FCB首址AL=00成功,01盘满02缓冲区太小
    23H取文件大小DS:DX=未打开的FCB首址AL=00成功,0FFH失败
    24H设置随机记录号DS:DX=打开的FCB首址
    25H设置中断向量AL=中断号DS:DX=中断程序入口
    *26H创建新的PSPDS:DX=新的PSP段地址
    27H随机读若干记录DS:DX=打开的FCB首址CX=要读入的记录数AL=00成功,01文件结束AL=02缓冲区太小AL=03缓冲区不满CX=读入的块数
    28H随机写若干记录DS:DX=打开的FCB首址CX=要写入的记录数AL=00成功,01盘满AL=02缓冲区太小AL=03缓冲区不满CX=已写的块数
    29H分析文件名AL=分析控制标记DS:SI=要分析的字符串ES:DI=未打开的FCB首址AL=00未通配符01有通配符0FFH驱动器字母无效ES:DI=未打开的FCB
    2AH取系统日期CX=年(1980-2099)DH=月,DL=日,AL=星期(0=星期日)
    2BH置系统日期CX=年,DH=月,DL=日AL=00成功,0FFH失败
    2CH取系统时间CH=时(0-23),CL=分,DH=秒,DL=百分之几秒
    2DH置系统时间CX=时,分DX=秒,百分秒AL=00成功,0FFH失败
    2EH设置/复位校验开关AL=0关闭,1打开
    2FH取磁盘传输地址DTAES:BX=DTA首地址
    30H取DOS版本AL,AH=DOS主、次版本
    31H结束并驻留AL=返回码,DX=内存大小
    *32H取指定驱动器的DPBDS:BX=DPB首址
    33H取或置Ctrl-Break标志AL=0:取,1:置,DL=标志DL=标志(取功能)0:关1:开
    *34H取DOS中断标志ES:BX=DOS中断标志
    35H取中断向量地址AL=中断号ES:BX=中断程序入口
    36H取磁盘的自由空间DL=驱动器号(0=缺省,1=AAX=FF驱动器无效其它每簇扇区数BX=自由簇数CX=每扇区字节数BX=文件区所占簇数
    *37H取/置参数分隔符取/置设备名许可标记AL=0:取分隔符,1:置分隔符,DL=分隔符2:取许可标记3:置许可标记,DL=许可标记DL=分隔符(功能0)DL=许可标记(功能2)
    38H取国家信息AL=0,DS:DX=缓冲区首址
    39H创建子目录DS:DX=路径字符串CF=0成功,1失败,AX=错误码
    3AH删除子目录DS:DX=路径字符串CF=0成功,1失败,AX=错误码
    3BH设置子目录DS:DX=路径字符串CF=0成功,1失败,AX=错误码
    3CH创建文件DS:DX=带路径的文件名CX=属性1-只读2-隐蔽4-系统CF=0成功,AX=文件号CF=1失败,AX=错误码
    3DH打开文件DS:DX=带路径的文件名AL=方式0-读1-写2-读写CF=0成功,AX=文件号CF=1失败,AX=错误码
    3EH关闭文件BX=文件号CF=0成功CF=1失败,AX=错误码
    3FH读文件或设备BX=文件号CX=字节数CF=0成功DX:AX=新的指针位置
    40H写文件或设备DS:DX=缓冲区首址CF=1失败,AX=错误码
    41H删除文件DS:DX=带路径的文件名CF=0成功,1失败,AX=错误码
    42H移动文件指针AL=方式0-正向1-相对2-反向BX=文件号,CX:DX=移动的位移量CF=0成功,DX:AX=新的文件指针CF=1失败,AX=错误码
    43H取/置文件属性AL=0:取1:置,CX=新属性DS:DX=带路径的文件名CX=属性(功能0)1-只读2-隐蔽4-系统20H-归档
    44H设备输入/输出控制:设置/取得与打开设备的句柄相关联信息,或发送/接收控制字符串至设备句柄AL=0/1取/置设备信息2/3读/写设备控制通道4/5同功能2/36/7取输入/输出状态BX=句柄(功能0-3,6-7)BL=驱动器号(功能4-5)CX=字节数(功能2-5)DS:DX=缓冲区(功能2-5)CF=0成功DX=设备信息(功能0)AL=状态(功能6/7)0未准备,1准备AX=传送的字节数(功能2-5)
    45H复制文件号(对于一个打开的文件返回一个新的文件号)BX=文件号CF=0成功,AX=新文件号CF=1失败,AX=错误码
    46H强行复制文件号BX=现存的文件号,CX=第2文件号CF=0成功,1失败AX=错误码
    47H取当前目录DL=驱动器号DS:SI=缓冲区首址CF=0成功,1失败AX=错误码
    48H分配内存BX=所需的内存节数CF=0成功,AX=分配的段数,CF=1失败,AX=错误码BX=最大可用块大小
    49H释放内存ES=释放块的段值CF=1失败,AX=错误码
    4AH修改分配内存ES=修改块的段值BX=新长度(以节为单位)CF=1失败,AX=错误码BX=最大可用块大小
    4BH装载程序运行程序AL=0装载并运行1获得执行信息3装载但不运行DS:DX=带路径的文件名ES:BX=装载用的参数块CF=1失败,AX=错误码
    4CH带返回码的结束AL=进程返回码
    4DH取由31H/4CH带回的返回码AL=进程返回码AH=类型码,0-正常结束1-由Ctrl-Break结束2-由严重设备错误而结束3-由调用31H而结束
    4EH查找第一个匹配项DS:DX=带路径的文件名CX=属性CF=1失败,AX=错误码
    4FH查找下一个匹配项CF=1失败,AX=错误码
    *50H建立当前的PSP段地址BX=PSP段地址
    *51H读当前的PSP段地址BX=PSP段地址
    *52H取DOS系统数据区首址ES:BX=DOS数据区首址
    *53H为块设备建立DPBDS:SI=BPB,ES:DI=DPB
    54H取校验开关设定值AL=标志值(0:关,1:开)
    *55H由当前PSP建立新PSPDX=PSP段地址
    56H文件换名DS:DX=带路径的旧文件名ES:DI=带路径的新文件名CF=1失败,AX=错误码
    57H取/置文件时间及日期AL=0/1取/置,BX=文件号CX=时间,DX=日期CF=0成功,CX=时间,DX=日期
  2. 打印字符串

    data segment
    	str db 'hello pangshu!$' ;$ 表示结尾标记
    	
    data ends
    code segment	
    
    start:	
    		mov ax,data
    		mov ds,ax
    		
    		;业务逻辑代码
    		mov dx,offset str;获取别名对应数据的偏移地址
    		mov ah, 9h ;9h表示调用显存 从dx总读取偏移地址对应的数据
    		int 21h
    		
    		;退出程序
    		mov ah, 4ch 
    		int 21h
    code ends
    end start