为什么这里只能执行一次?

wendaosheyu 2008-11-18 06:53:59
assume cs:code
code segment
in al,60H
iret
start:mov ax,0
mov ds,ax
mov bx,9*4+2
mov ax,code
mov [bx],ax
mov bx,9*4
mov word ptr [bx],0
;-------设置 INT 9
mov ax,0B800H
mov ds,ax
mov bx,0
;-------显存段地址
mov cx,0FFFEH
s:cmp al,26H
jnz s
;-------判断'L'键是否按下
p:mov byte ptr [bx],76
inc bx
mov byte ptr [bx],00001100B
inc bx
mov al,0
jmp s
;-------显示一个红色的'L'
mov ax,4C00H
int 21H
code ends
end start


感觉应该是按一次L键显示一个L啊
可是只有第一次按的时候是L键才会显示一个L,之后就死掉了

还有为什么运行的时候会出现光标?循环就会出现光标?
为什么我写的这个程序运行之后CPU占用就马上会升到100%?而且一直是100%.桌面右键刷新的速度会变慢,IE会卡住,打不开网页,把程序关掉之后一切恢复正常.
可是int 16H却不会,int 16H不也是循环等待么

问题多一点...........
给个解决的办法啊...................................
...全文
182 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-11-19
  • 打赏
  • 举报
回复
这就结帖了?!最基本的push、pop都没有,没见过有这么写硬中断程序的。
cnzdgs 2008-11-19
  • 打赏
  • 举报
回复
硬件中断程序怎么能怎么简单,至少要保护寄存器和向中断控制器输出中断结束命令,另外应该把读入的扫描码保存到内存里面。
wendaosheyu 2008-11-19
  • 打赏
  • 举报
回复
mov cx,0FFFEH 没用
笔误
加菲猫快来啊...........
wendaosheyu 2008-11-19
  • 打赏
  • 举报
回复
王爽的书没写关于8259A的东西啊...........
缺斤少两啊.....
好像明白一点了
killbug2004 2008-11-19
  • 打赏
  • 举报
回复
学习了,上面讲得很明白,我也准备深入学习一下这个方面的内容
xiaopoy 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cnzdgs 的回复:]
硬件中断程序怎么能怎么简单,至少要保护寄存器和向中断控制器输出中断结束命令,另外应该把读入的扫描码保存到内存里面。
[/Quote]
纯帮顶
该先参考下原始int9的code?至少得知道需要做的事吧
jlabel 2008-11-19
  • 打赏
  • 举报
回复
回楼上的
我的是调用了原来的int 9例程 这样处理比较简单,并且原来的系统提供的按键操作都还可以用,而且屏蔽了8259a的细节.

如果不调用原来的中断就简单实现楼主的功能 中断保存什么的都不要了.


assume cs:code
code segment
in al,60H
mov dl,al
mov al, 20h
out 20h, al ;设置8259A中断控制器
mov al,dl
iret
start:mov ax,0
mov ds,ax
mov bx,9*4+2
mov ax,code
mov [bx],ax
mov bx,9*4
mov word ptr [bx],0
;-------设置 INT 9
mov ax,0B800H
mov ds,ax
mov bx,0
;-------显存段地址
mov cx,0FFFEH
s:cmp al,26H
jnz s
;-------判断'L'键是否按下
p:mov byte ptr [bx],76
inc bx
mov byte ptr [bx],00001100B
inc bx
mov al,0
jmp s
;-------显示一个红色的'L'
mov ax,4C00H
int 21H
code ends
end start


dos下运行晚这个程序只能重启了,呵呵.
nosachow 2008-11-19
  • 打赏
  • 举报
回复
帮忙回答一下,

assume cs:code
code segment
cli
in al, 60h
mov cs:tempsave,al
mov al, 20h ;8259
out 20h, al ;end of interrupt

Iret

start:
mov ax,0
mov ds,ax

push word ptr ds:[9*4]
push word ptr ds:[9*4+2]


mov bx,9*4+2
mov ax,code
mov [bx],ax
mov bx,9*4
mov word ptr [bx],0
;-------设置 INT 9
mov ax,0B800H
mov ds,ax
mov bx,0
;-------显存段地址
s:
mov al, cs:tempsave
sti
cmp al, 39h ;0B9h ;Press blank to exit
jz short @F
cmp al, 26h ;0A6H
jnz s
;-------判断'L'键是否按下
p:
mov cs:tempsave, 0
mov byte ptr [bx],76
inc bx
mov byte ptr [bx],00001100B
inc bx
mov byte ptr [bx],77
inc bx
mov byte ptr [bx],00001000B
inc bx
jmp s
;-------显示一个红色的'L',灰色的‘M’
@@:
mov ax,0
mov ds,ax

pop word ptr ds:[9*4+2]
pop word ptr ds:[9*4]


mov ax,4C00H
int 21H

tempsave db 0

code ends
end start

红字标记的是程序的关键,楼主改变了中断向量的入口地址,自己改写中断服务程序,得通知CPU去相应你的中断服务程序程序呀,tempsave里面是存的你改写的中断服务程序得到的键盘的ASCII吗,你得暂存起来,供判断用,还有,改变的中断向量,最好还是坐下恢复现场的动作吧。

还有问下楼上的,你的程序好像还是调用的原来的int 9的例程吧,楼主想做的事情是想自己写int 9的键盘中断程序吧。
jlabel 2008-11-19
  • 打赏
  • 举报
回复
改变颜色后换行出现问题了.
注意红字后面黑色字的也是汇编指令 不是注释.
不能编辑自己的帖子真奇怪.
jlabel 2008-11-19
  • 打赏
  • 举报
回复
我来回答一下
1、为什么只显示一个L
这个问题是因为在int 9中断中处理了很多有关硬件的细节问题。如果编写如此一个简单的int 9中断处理程序就会忽略掉很多硬件的细节造成程序死掉。在你的程序中可以简单的调用一下原来的int 9中断程序就行了。
我修改后的代码如下:
assume cs:code
code segment
in al,60H
pushf ;标志寄存器入栈
call dword ptr es:[0] ;调用原来的int 9中断
iret
start:mov ax,0
mov ds,ax
mov ax,data
mov es,ax ;设置es
mov bx,9*4+2
mov ax,code
mov dx,[bx]
mov es:[2],dx ;保存原int 9中断
mov [bx],ax
mov bx,9*4
mov dx,[bx]
mov es:[0],dx ;保存原int 9中断
mov word ptr [bx],0
;-------设置 INT 9
mov ax,0B800H
mov ds,ax
mov bx,0
;-------显存段地址

s:cmp al,26H
jnz s
;-------判断'L'键是否按下
p:mov byte ptr [bx],76
inc bx
mov byte ptr [bx],00001100B
inc bx
mov al,0
jmp s
;-------显示一个红色的'L'
mov ax,4C00H
int 21H
code ends
data segment ;定义一个段存放原int 9中断
dw 0,0
data ends

end start

上面的程序保存并调用了原来的中断所以可以正常运行。

2、你的程序并没有设置光标 闪烁的光标是系统的行为所以会有光标。

3、你的程序为一个死循环,这个死循环需要一直占用cpu资源所以cpu使用率会一直100% cpu被占用所以你干其它的事情就会很慢(从这点可以看出楼主的电脑配置不高,我猜是赛扬系列的,呵呵)

4、int 16h 不会100%占用cpu 如果它获得不了按键就等待。这个就好像操作系统中讲的,int 16h如果没有按键就挂起把cpu时间让给其它进程。这个也跟现在windows系统中的16位的虚拟机有关。

这样楼主应该明白了吧.
推荐一个好的汇编网站
www.asmedu.net

这个网站中的论坛中有不少讨论中断的内容

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧