汇编网首页登录博客注册
chinatree的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
友情链接

[2011-09-04 20:56] 第15章检测点及实验15

图片载入中
(1)仔细分析一下上面的int 9中断例程,看看是否可以精A间-,z-一下?
    其实在我们的int 9中断例程中,模拟n指令调用原int 9中断例程的程序段是可以
精简的,因为在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。对于程
序段:
pushf 
pushf
pop ax
and ah,11111100b
push ax
popf
call dword ptr ds:[0]
可以精简为:
pushf
call dword ptr ds:[0]
两条指令。
    (2)仔细分析上面程序中的主程序,看看有什么潜在的问题?
    在主程序中,如果在执行设置int 9中断例程的段地址和偏移地址的指令之间发生了键盘中断,则CPU将转去一个错误的地址执行,将发生错误。
找出这样的程序段,改写它们,排除潜在的问题。
提示,注意sti和cli指令的用法。
cli
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
sti


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

assume cs:code,ss:stack
stack segment stack
db 64 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,64
xor ax,ax
mov es,ax
push es:[4*9]
pop es:[200h]
push es:[4*9+2]
pop es:[202h]
cli
mov word ptr es:[4*9],offset int9
mov word ptr es:[4*9+2],cs
sti
a_a:in al,60h
cmp al,10h
jnz a_a
xor ax,ax
mov es,ax
push es:[200h]
pop es:[4*9]
push es:[202h]
pop es:[4*9+2]
mov ax,4c00h
int 21h
int9: push es
in al,60h
xor bx,bx
mov es,bx
PUSHF
call dword ptr es:[200h]
cmp al,9eh
jnz sa
mov bx,0b800h
mov es,bx
xor di,di
mov cx,2000
s_a:mov byte ptr es:[di],'A'
add di,2
loop s_a
sa:cmp al,1
jnz rqt
mov bx,0b800h
mov es,bx
mov di,1
mov cx,2000
s_a_a:inc byte ptr es:[di]
add di,2
loop s_a_a
rqt:pop es
iret
int9e:nop
code ends
end start
评论次数(5)  |  浏览次数(549)  |  类型(汇编作业) |  收藏此文  | 

[  chinatree   发表于  2011-09-04 22:34  ]

终于弄好了,我再去对比下,看看是什么原因。

[  tomato   发表于  2011-09-05 08:45  ]

结果出来了就没问题。

[  rotapple   发表于  2011-09-05 10:13  ]

按住CTRL+ALT+截屏就只戴当前窗口不戴整个桌面了。

[  rotapple   发表于  2011-09-05 10:14  ]

你的ASM文件默认竟然是播放器打开。。。 --b

[  chinatree   发表于  2011-09-05 10:33  ]

我也想知道怎么回事,就是图标改不过来了,至于楼上说的截屏方法,谢谢了,我还真不知道。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码