马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
首先申明一下,本帖子篇幅有些长,字有些多,废话也有点多。希望好奇的人能耐着性子慢慢看下去,谢谢! 看了王爽老师的《汇编语言》和小甲鱼的视频,学习到了实验12 实验12的题目是:编写0号中断的处理程序 也就是自己编写中断程序,修改系统默认的int 0 的中断例程。 要求是在屏幕中间显示“overflow”字符串,为了显眼,我给它加上了绿色。 然后,下面是我编的程序,其实也算不上自己编的,差不多就是从书上给copy下来的。但其中的意思我还是理解了。代码如下: assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do0 ;设置源地址
mov ax,0
mov es,ax
mov di,200h ;设置目的地址
mov cx,offset do0end - offset do0 ;cx为传输长度
cld ;正向
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h ;偏移地址
mov word ptr es:[0*4+2],0 ;段地址
int 0 ;代码第21行,调用除法溢出中断
mov ax,4c00h
int 21h
do0: jmp short do0start
db 'Overflow!'
do0start: mov si,offset do0 + 2 ;设置si指向字符串
mov ax,0b800h
mov es,ax
mov di,12*160+36*2 ;设置es:di指向显存空间的中间位置
mov cx,9 ;设置字符串长度cx
s: mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],2h ;设置颜色属性
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end: nop
code ends
end start
为了验证是否修改了默认的int 0,我在第21行加上了一句 int 0 ,也就是调用了除法溢出中断例程。 首先,我在cmd中直接将编译好的1.exe (程序名以1命名的) 运行。结果屏幕一闪而过,我猜想应该是经过了debug窗口后迅速的回到了cmd窗口上,按道理说应该会有我所期待的结果:在屏幕中间输出绿色的“overflow”字符串的,结果cmd窗口还是黑咕隆咚一片,如下图: 然后我很是郁闷,因为看小甲鱼演示的时候,屏幕上还出现了令人兴奋的“I Love fishc.com” 而我的却漆黑一片。。。。怎能不叫人郁闷的! 于是决定我单步调试,找到问题的所在, 经过了一番捣鼓,似乎有点进展,我直接用g命令跳转到指令 mov ax,4c00h int 21h 这个地方,然后屏幕上出现了我期待已久的绿字!如下图: 不免激动了一把! 然后继续往后学习,发现后面调用中断例程的程序都是两个程序,就是说,一个程序负责安装中断例程,另一个则用来调用这个中断例程。 然后我有郁闷了,我想,既然分成了两个程序(或文件),先用程序1安装中断例程,然后退出程序1,执行程序2使它触法程序1的中断例程,这样还能得到预期的结果吗?程序2是在程序1关闭以后才调用程序1的,这时候程序1写的那写中断处理代码在内存中不是很容易让别的程序给覆盖或者修改了吗? 口说无凭,时间是检验真理的唯一标准嘛。于是我又动手了...... 然后我写了一个程序2(名字就叫2.exe),2.exe的目的是做出会溢出的除法,这样就可以调用int 0 的除法溢出响应中断了。代码如下: assume cs:code
code segment
start: mov ax,1000h
mov bl,1
div bl ;目的产生除法溢出
mov ax,4c00h
int 21h
code ends
end start
为了让1.exe中的除法溢出不影响2.exe,于是我把1.exe中的第21行 int 0 ;代码第21行,调用除法溢出中断 给注释了。这样1.exe就是单纯的设置0号中断处理程序,使其在屏幕中间输出字符串。 然后按照书上的介绍和小甲鱼的操作,在cmd中先运行1.exe(前提当然是1,2都编译好了) 然后在运行2.exe,按照预想的和小甲鱼的实际操作,2.exe运行之后将会在屏幕中间出现绿色的字符串,可奇怪的是我的窗口中依然是黑咕隆咚的,啥也没有。。。。 如下图: 然后我就纳闷+郁闷啊……怎么回事呢!!诶,还是但步跟踪调试吧, 于是我开始debug 2.exe了,幸好2.exe不长,就3句代码。调试如下,结果和我想的差不多: 首先,可以肯定一点,int 0的0号中断的默认处理程序确实被修改了; 然后,和我预想的差不多, 1.exe中的中断例程的目的是“出现除法溢出后在屏幕中间输出绿色的'overflow'字符串”,可结果却是输出了这么一串乱码,我想就是因为1.exe 退出后,有些代码数据被其他程序该占用或者改写的原因吧。可是,让我不解的是,为了在我的机子上是这样的,而在小甲鱼老师的机子上是很正常的输出了,都不用debug 2.exe的,直接在cmd下就可以。这个让我很是纠结!!!难道是我的机子“高级”了点?还有就是各位鱼友在你们的机子上是个什么情况啊?帮忙测试一下哈。。。 诶,说到这个发帖也是让我头疼了一把,这么多字,我承认废话确实挺多,很高兴你能耐心的看到了这里。而且这号是新号,发贴的时候还不让帖图片,愣是让我弄了好久!不容易啊!本来看这么长的字了,不如直接写个日志吧,可因为我的等级太低,竟然连日志都不能写。。。。郁闷啊 。。。。强烈谴责小甲鱼,你不能这么鄙视新人吧,不能因为等级低就不能让人家不能写日志吧。。。。抗议,改革!
|