| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 649 人关注过本帖
标题:关于外中断的一个问题
只看楼主 加入收藏
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
关于外中断的一个问题
这是一个访问 cmos ram 芯片的程序 ,运行后能按   年/月/日 时:分:秒  显示时间 ,如果按下 esc 就退出 ,代码如下 ,我想问的问题在下面

assume cs:code

code segment

 s:    db 9,8,7,4,2,0

start:
    mov si,offset s
    mov ax,code
    mov ds,ax
    mov cx,6
   
    mov bx,0b800h
    mov es,bx
    mov di,160*12 + 40*2

 sa:    push cx
    mov al,ds:[si]
    out 70h,al
    in al,71h
   
    mov ah,al
    mov cl,4
    shr ah,cl
    and al,00001111b
    add ah,30h
    add al,30h
   
    mov byte ptr es:[di],ah
    mov byte ptr es:[di+2],al
  
    inc si
    pop cx
    dec cx
    cmp cx,3
    je se
    mov byte ptr es:[di+4],'/'
    add di,6   
    jmp short sa                          ;年/月/日显示

 se:    push cx
    mov al,ds:[si]
    out 70h,al
    in al,71h
   
    mov ah,al
    mov cl,4
    shr ah,cl
    and al,00001111b
    add ah,30h
    add al,30h
   
    add di,6
    mov byte ptr es:[di],ah
    mov byte ptr es:[di+2],al

    inc si
    pop cx
    dec cx
    cmp cx,0
    je sc
    mov byte ptr es:[di+4],':'                ;时:分:秒显示
    jmp short se

 sc:    cli                                                 ;这个 cli 本来是没有的,但是书上说如果 if = 0 ,cpu 就不会理会可屏蔽中断,所以我想试试
    in al,60h ;利用键盘中断退出程序                          但我加上 cli 后,按下 esc 仍能终止程序,不知道为什么,请高手指教
    cmp al,01h ;esc键的扫描码                                还有一个问题,我知道 通码 + 80h = 断码 ,当我把 cmp al,01h 改成 cmp al,81h 时
    je quit                                                  我以为我一直按下 esc 时程序仍能运行,松开 esc 时程序才终止,但并不是这样,我一按键就终止了
    jmp start                                                这也让我很纳闷,请指教
 quit:
    mov ax,4c00h
    int 21h
code ends

end start
搜索更多相关主题的帖子: 时间 
2011-05-18 21:21
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:10 
1. 看书,不响应可屏蔽中断(MASK INTERRUPT),不响应==没有中断?
   IN和中断有关系?
2.
程序代码:
sc:   
    mov  ah,1
    int  16h
    in   al,60h   
    cmp  al,81h
    je   quit
    jmp  start
3. 下次贴代码能不能放在框框里对对齐?

技术问题,请不要以短消息方式提问
2011-05-18 23:32
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
是不是
如果中断被屏蔽了没有到达 cpu ,那就不会处理中断了,但中断还是发生了的,而我的程序中恰好是发生了中断(也被屏蔽了),但暂不处理中断的情形呢?
…那这里的中断是指哪一个过程,是指 int 9h 吗?感觉怪怪的还是不清楚

in 和中断没有关系是不是说,不管 cpu 在做什么,只要键盘有输入,都会送到 60h 端口中, in al,60h 是一条读取指令不是中断对吗

我查了查 INT 16H
如果 AH=1:测试有无键被按下。ZF=0,表示按过任意键,并在AL中获得该键的ASCII码。ZF=1,未按过键

那么程序中 int 16h 之后, al 应该是 esc 的 ascll 码值,
但这之后就被 in al,60h 覆盖了,那执行 int 16h 是为了什么?
为什么 cmp al,81h 时比较的是 81h ,程序也说 je 跳转,但没有 int 16h 指令时,
程序受到通码也会跳转呢?

版主,拜托了

噢还有我使用记事本写的代码,tab 的距离可能和网页上的不同,所以不整齐,下次注意~
2011-05-19 09:10
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
等有时间我再查查资料,再想想

技术问题,请不要以短消息方式提问
2011-05-19 10:17
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 4楼 zaixuexi
版主,我又试了试,现在
in al,60h
cmp al,某断码
可以实现了,不知道那天机子搞什么鬼,一按就退出,现在可以松开键的时候才退出
并且别的类似程序也可以

不过用 cli 屏蔽中断的问题还是没怎么弄懂
书上有个写新的 int 9 中断时,会改写 int 9 的中断向量,
然后说,改写的时候,应该

cli
(改写中断向量)
sti

是为了保护不受别的键盘中断影响,不然 cpu 可能跳转到别的地方执行指令

我没弄懂 cli 在程序中的作用,所以也不清楚这啊,求助!
2011-05-20 12:07
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
cli             ;关中断
(改写中断向量);原子操作,不能被打断
sti             ;开中断


技术问题,请不要以短消息方式提问
2011-05-20 14:11
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
谢版主,
我还得好好学习
2011-05-21 08:32
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 6楼 zaixuexi
版主,我看到一些东西

8086 代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli 和中断返
回指令iret 等。这些指令在8086 程序中是合法的。如果不让这些指令执行,8086 代码就无
法工作。为了解决这个问题,虚拟86 管理程序采用模拟的方法来完成这些指令。这些特权指
令执行的时候引起了保护异常。虚拟86 管理程序在异常处理程序中检查产生异常的指令,如
果是中断指令,则从虚拟86 任务的中断向量表中取出中断处理程序的入口地址,并将控制转
移过去;如果是危及操作系统的指令,如cli 等,则简单地忽略这些指令,在异常处理程序返
回的时候直接返回到下一条指令。通过这些措施,8086 程序既可以正常地运行下去,在执行
这些指令的时候又觉察不到已经被虚拟 86 管理程序做了手脚。MS-DOS 应用程序在
Windows 操作系统中就是这样工作的。


是因为这样,所以程序在 command 中运行的时候,cli 看不出起到的作用吧
2011-05-22 10:28
快速回复:关于外中断的一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062895 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved