x86汇编语言之内中断

x86汇编语言之内中断「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。 概述 中断 顾名思义,程序运行到一半暂时断开,官方一点说就是,由于软件或者硬件信号,使得cpu暂停当前任务,转而执行另一

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

概述

  1. 中断

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

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

    中断的分类:

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

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

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

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

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

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

    中断 功能 入口参数 出口参数
    INT16 键盘输入 AH=0H读键盘 AH=10读扩展键盘 AH=键盘扫描码 AL=字符ascii码
    INT20 程序正常退出 CS=PSP段地址
    INT21 系统功能调用 AH=功能号
    INT22 程序结束处理
    INT23 Ctrl-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/O DL=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 设置磁盘缓冲区DTA DS:DX=磁盘缓冲区首址
    *1BH 取缺省驱动器的磁盘格式信息 AL=每簇的扇区数CX=每扇区的字节数DX=数据区总簇数-1DS:BX=介质描述字节
    *1CH 取指定驱动器的磁盘格式信息 DL=驱动器号(0=缺省,1=A..) AL=每簇的扇区数CX=每扇区的字节数DX=数据区总簇数-1DS:BX=介质描述字节
    *1DH 保留未用
    *1EH 保留未用
    *1FH 取缺省驱动器的DPB DS: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 创建新的PSP DS: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 取磁盘传输地址DTA ES:BX=DTA首地址
    30H 取DOS版本 AL,AH=DOS主、次版本
    31H 结束并驻留 AL=返回码,DX=内存大小
    *32H 取指定驱动器的DPB DS: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=A AX=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 为块设备建立DPB DS:SI=BPB,ES:DI=DPB
    54H 取校验开关设定值 AL=标志值(0:关,1:开)
    *55H 由当前PSP建立新PSP DX=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 
    

今天的文章x86汇编语言之内中断分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/19303.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注