鱼C论坛

 找回密码
 立即注册
查看: 2307|回复: 1

[汇编作业] 实验 15 安装新的int 9 中断例程

[复制链接]
发表于 2019-3-29 16:03:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
安装一个新的int 9 中断例程, 功能:在DOS下,按“A”键后,除非不在松开如果松开,就显示满屏幕的“A”;其他的键照常处理。
提示, 按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。断码=通码 + 80h。

  1. assume cs:code, ss:stack

  2. stack segment
  3.                 db 128 dup (0)
  4. stack ends


  5. code segment
  6. start:                                        ;把int 9h里的地址传到0000:0200-0000:0204中,这样可以不占用
  7.                 mov ax, stack
  8.                 mov ss, ax
  9.                 mov sp, 128
  10.                
  11.                 mov ax, cs
  12.                 mov ds, ax
  13.                 mov si, offset int_9
  14.                
  15.                 mov ax, 0
  16.                 mov es, ax
  17.                 mov di, 204h
  18.                
  19.                 mov cx, offset int_end - offset int_9
  20.                
  21.                 cld
  22.                 rep movsb
  23.                
  24.                 push word ptr es:[ 9 * 4]
  25.                 pop word ptr ds:[200h]
  26.                
  27.                 push word ptr es:[9 * 4 + 2]
  28.                 pop  word ptr ds:[200h + 2]
  29.                
  30.                
  31.                 ;安装到中断限量表中
  32.                
  33.                 cli
  34.                 mov word ptr es:[9 * 4], 204h
  35.                 mov word ptr es:[9 * 4 + 2], 0h
  36.                 sti

  37.                
  38.                 mov ax, 4c00h
  39.                 int 21h
  40.                
  41. int_9:
  42.                 push ax
  43.                 push bx
  44.                 push cx
  45.                 push es
  46.                
  47.                 mov bx, 0                        ;因为怕bx中有数据所以先归零
  48.                
  49.                 pushf
  50.                 call dword ptr cs:[200h]
  51.                
  52.                 in al, 60h
  53.                
  54.                 ;判断是否是a键的断码如果不是那就跳转如果是就向下执行
  55.                 cmp al, 1eh + 80h
  56.                 jne loop_2
  57.                
  58.                 mov ax, 0b800h
  59.                 mov es, ax
  60.                
  61.                 mov cx, 2000
  62. loop_1:
  63.                 mov byte ptr es:[bx], 'a'  
  64.                 add bx, 2
  65.                 loop loop_1
  66.                
  67. loop_2:
  68.                
  69.                 pop es
  70.                 pop cx
  71.                 pop bx
  72.                 pop ax
  73.                 iret
  74. int_end:
  75.                 nop
  76.                
  77.                
  78. code ends
  79. end start
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 19:27:20 | 显示全部楼层
复制代码运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 16:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表