小工具知识网

当前位置: 首页 > 行业知识 > 《汇编语言》- 读书笔记 - 第15章-外中断-实验15 安装新的 int9 中断例程

行业知识

《汇编语言》- 读书笔记 - 第15章-外中断-实验15 安装新的 int9 中断例程

2026-11-01 09:38:14 来源:互联网转载

《汇编语言》- 读书笔记 - 第15章-外中断-实验15 安装新的 int9 中断例程

  • 需求
  • 代码
  • 运行index.php/tags-41973.html" >���果

    需求

    安装一个新的 int 9 中断例程,功能:在 DOS 下,按下A键后,除非不再松开如果松开,就显示满屏幕的A,其他的键照常处理。

    提示,按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。

    断码 = 通码 + 80h。

    代码

    assume cs:codestack segmentdb 128 dup(0)stack endscode segment start: mov ax,stack; 设置栈段和栈顶位置mov ss,axmov sp,128; -------- 安装: 复制中断例程到目标内存 -------mov ax,cs;设置 ds:si 指向源地址mov ds,axmov si,offset int9mov ax,0;设置 es:di 指向目的地址mov es,axmov di,204hmov cx,offset int9end-offset int9;设置 cx为传输长度cld;设置传输方向为正。movsb中si,di递增rep movsb;重复复制数据次数由 cx 控制; -------- 安装: 复制中断例程到目标内存 -------; ---------- 备份原 int9 入口到 [0:200~0203] ----------push es:[9*4]pop es:[200h]push es:[9*4+2]pop es:[202h]; ---------- 备份原 int9 入口到 [0:200~0203] ----------; ---------- 设置中断向量表 ----------cli; 临时屏蔽中断mov word ptr es:[9*4],204h; 设置的偏移地址(0~3用来存原int9地址了)mov word ptr es:[9*4+2],0; 设置的段地址sti; 恢复中断; ---------- 设置中断向量表 ----------ok:mov ax,4c00hint 21h; =======================================================; --------------------- 子程序 int 9  -------------------; 调用原 int 9 获取扫描码,松开 A 显示满屏幕的 A; -------------------------------------------------------; 参数: 无; 返回: 无; -------------------------------------------------------int9:push ax ; 备份寄存器push bxpush cxpush esin al,60h; 从60h端口读取数据; 模拟 int 指令,用 call 调用原 int 9pushf; 进入中断后 IF、TF已经是0 直接入栈即可call dword ptr cs:[200h] ; 调用原来的 int 9 中断例程cmp al,9eh; 判断是否 A 键松开jne int9ret; 如果不是直接结束mov ax,0b800h; 设置显存mov es,axmov bx,0mov cx,2000mov ah,00000111bs:mov al,65mov word ptr es:[bx],axadd bx,2loop sint9ret:pop es; 还原寄存器pop cxpop bxpop axiret; 返回int9end:nop; --------------------- 子程序 int 9 ------------------; =======================================================code endsend start

    运行效果

上一篇:揭秘发音秘诀,如何精准掌握um发音?

下一篇:米芾的正确读音与背景深度解析