- [kanwangxue] 感觉楼主很乖的。有点孩子气。呵呵。 01/27 08:58
- [kanwangxue] it界,进去干嘛啊,到时候自己牛比了,首先写一个自己的语言,自己用。进入IT界不就是随波做流吗/?他 01/27 08:57
- [kanwangxue] 哥们,不要为了赚钱而学计算机。 计算机是年轻时候干的, 30岁后可以开始想赚钱,年轻嘛,不要这么悲 01/27 08:50
- [游客] 怎么说? 01/26 16:22
- [游客] 你这不行啊,差远了! 01/10 22:29
- [chinatree] 谢谢你。相信你也会成功的。 01/09 14:22
- [landyking] 哥们儿,好久不见。相信你会成功的。 12/02 23:34
- [chinatree] 哇哇,被挖坟了。莫生气,只是感觉谦虚些好,就算你的程序真的是史上最强的,也别说出来嘛,自己偷着乐就行 11/20 00:41
- [xiaoyao2012] 你的程序和我的程序比较也不见得你的程序又节约空间,在某种意义上说你的程序用了没学的指令,所以不见得你 11/19 15:39
- [heliang6291] 一起加油啊 07/02 02:45
- [游客] 急需一个汇编程序大作业。。。。。。。。。。。。。。。。。。。??? 12/28 16:50
- [游客] 这么多人喜欢你,我嫉妒了。但你不可以喜欢那么多,允许你在我不需要你的时候帮别人。如果我需要立叫立到。 11/13 13:11
- [tily] 兄弟 我来看你啦 呵呵 最近可好呀 09/26 22:17
- [stqcw] 能加我qq吗?1270911891 我在做课程设计2的时候 遇到点问题 09/24 09:16
- [stqcw] 能加我qq吗?1270911891 我的环境还是有点问题。按下A的时候不能显示满屏的A 09/20 09:36
- [stqcw] 牛人 我在xp里面运行王爽 汇编第二版 p280的例子 按下esc键没反应 呀 怎样在虚拟机里配置一 09/17 15:18
- [landyking] 呵呵,交个朋友,共同学习. 09/08 00:03
- [luyingdzx] 能知道你的QQ吗?或者请加一下我的QQ271190440,可以吗 虽然在论坛能获得解答,但是有的问 08/07 21:32
[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
其实在我们的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) |
类型(汇编作业) |
收藏此文 |