在int9中断中如何使用call方式进行程序跳转
2009-02-17 15:25
549 查看
对于一个刚读完《王爽汇编语言》的初学者来说,在int9中断中使用call table[0] 这种方式进行跳转是个令人头痛的问题。
这个问题困恼了我许多天最后还是CSDN的朋友帮我解决了这个问题!该问题出现在 《王爽汇编语言》第16章的试验中。
问题如下:
这是一个16位dos程序,根据键盘输入(int9中断)来做相应的处理,以下代码能够正确运行,却无法实现需要的功能!
;jmp bx 需要用注释的这两种方式来运行程序,任意一种均可,已在代码中做好注释!
;call table[0]
cnzdgs的回答:
我想你目前遇到的障碍是由于把代码复制到了0:204H处而引起的。王爽发明的这种做法,如果单纯编程玩玩还可以,在实际应用中是不可取的,原因很简单,0:200H是中断向量表范围,不允许储存其它数据,驻留程序应该使用相应的DOS功能调用。
对于目前遇到的问题,是因为offset int9不等于204H,所以在int9程序中,所有用到偏移量(绝对地址)的地方都会出问题,简单的解决办法是在int9:前面加上org 204H,也可以用避免使用绝对地址的方式来解决,不过比较麻烦。
代码:
assume cs:code
code segment
org 204h
int9: ;自定义的int9中断例程
jmp short init
table_index db 2,3,4,5
table dw sub3 ;226h,0 1,清空,2,设置前景,3,设置背景,4,屏幕向上滚动
init:
push ax
push bx
push cx
push es
push ds
in al,60h
pushf
call dword ptr cs:[200h]
mov bx,20h
mov ds,bx
mov bx,table[4]
add bx,204h
;call sub3
;---------------------------------------------------------------------------
;jmp bx 需要用注释的这两个方式来运行程序,任意一种均可
call table[0]
;---------------------------------------------------------------------------
jmp int9ret
sub3:
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
shl al,1
shl al,1
shl al,1
shl al,1
sub3s:
and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
ret
int9ret:
pop ds
pop es
pop cx
pop bx
pop ax
iret
int9end:
nop
start:
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb ;安装自定义的int9中断例程
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;保存原中断向量
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0h ;设置自定义的中断向量
sti
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],'A'
add bx,2
loop s
mov cx,120
lp: mov ah,0 ;进行120次读取BIOS键盘缓冲区的操作,
int 16h
loop lp
mov ax,4c00h
int 21h
code ends
end start
这个问题困恼了我许多天最后还是CSDN的朋友帮我解决了这个问题!该问题出现在 《王爽汇编语言》第16章的试验中。
问题如下:
这是一个16位dos程序,根据键盘输入(int9中断)来做相应的处理,以下代码能够正确运行,却无法实现需要的功能!
;jmp bx 需要用注释的这两种方式来运行程序,任意一种均可,已在代码中做好注释!
;call table[0]
cnzdgs的回答:
我想你目前遇到的障碍是由于把代码复制到了0:204H处而引起的。王爽发明的这种做法,如果单纯编程玩玩还可以,在实际应用中是不可取的,原因很简单,0:200H是中断向量表范围,不允许储存其它数据,驻留程序应该使用相应的DOS功能调用。
对于目前遇到的问题,是因为offset int9不等于204H,所以在int9程序中,所有用到偏移量(绝对地址)的地方都会出问题,简单的解决办法是在int9:前面加上org 204H,也可以用避免使用绝对地址的方式来解决,不过比较麻烦。
代码:
assume cs:code
code segment
org 204h
int9: ;自定义的int9中断例程
jmp short init
table_index db 2,3,4,5
table dw sub3 ;226h,0 1,清空,2,设置前景,3,设置背景,4,屏幕向上滚动
init:
push ax
push bx
push cx
push es
push ds
in al,60h
pushf
call dword ptr cs:[200h]
mov bx,20h
mov ds,bx
mov bx,table[4]
add bx,204h
;call sub3
;---------------------------------------------------------------------------
;jmp bx 需要用注释的这两个方式来运行程序,任意一种均可
call table[0]
;---------------------------------------------------------------------------
jmp int9ret
sub3:
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
shl al,1
shl al,1
shl al,1
shl al,1
sub3s:
and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
ret
int9ret:
pop ds
pop es
pop cx
pop bx
pop ax
iret
int9end:
nop
start:
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb ;安装自定义的int9中断例程
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;保存原中断向量
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0h ;设置自定义的中断向量
sti
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],'A'
add bx,2
loop s
mov cx,120
lp: mov ah,0 ;进行120次读取BIOS键盘缓冲区的操作,
int 16h
loop lp
mov ax,4c00h
int 21h
code ends
end start
相关文章推荐
- 如何使用TCP/IP与服务器进行通信-一个简单的聊天程序
- gdb的简单使用和gdb+gdbserver方式进行ARM程序调试
- EXTJS4如何使用单个app程序来进行大型软件开发
- 如何使用常用的6种方式对数据进行转换(二)
- gdb的简单使用和gdb+gdbserver方式进行ARM程序调试
- 如何正确使用javascript 来进行我们的程序开发
- Ruby使用Monkey Patch猴子补丁方式进行程序开发的示例
- Yii终止运行,进行跳转,不使用exit进行终止程序。
- 在Java中,如何把一个程序的结果需要保存起来,供下一个程序使用的方式
- spring2.0中使用Aspect方式进行AOP如何得到method对象
- EXTJS4如何使用单个app程序来进行大型软件开发
- Yii终止运行,进行跳转,不使用exit进行终止程序。
- iOS开发之如何通过路由方式进行页面间的跳转
- 如何在IIS7上配置 FTP7并使用IIS管理凭据方式进行验证
- 使用51单片机采用中断方式进行串口通信的学习记录:
- 如何在IIS7上配置 FTP7并使用IIS管理凭据方式进行验证?
- VS下如何配置才能使用 cl 命令行方式编译 C/C++ 程序
- 如何使用Zealware提供的SMGPAPI进行固网小灵通短信网关程序开发?
- 如何使用代码的方式进行Autoresizing布局
- 如何在windows上使用eclipse远程连接hadoop进行程序开发