编写并安装int 7ch中断例程,功能为完成loop指令的功能
参数:(cx)= 循环次数,(bx)= 位移
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后cs、ip和栈中的状态。
在屏幕中间显示80个‘!’
遇到的问题:无法显示字符串"!!!!!!(80个)"
解决方法:用测试程序调试,发现调用int 7ch中断例程后程序的指向不正确
找到以下逻辑错误(非语法错误),都是中断例程安装时的问题:
1.mov si,sub_loop 忘了offset操作符,反汇编了一下发现有无操作符offset对生成的机器码没有影响,
程序照样能正确的跑起来.
2.mov si,200h 应该改为mov di,200h,因为后边用了串传送指令,默认的目的地址在es:[di]中.
收获: 1.编写程序到底是一口气先写完了再添加注释,还是边写边添加注释,我自己的看法是前者节省时间,
思路不易被打断,写完了会比较爽.但是出了问题查错比较麻烦,后者与其相反.到底采用哪种方式,还在思索中...
2.编程的时候最好先把框架搭建起来,里面可以有中文的描述(称其为伪代码),这样不易漏掉东西,比如就
这个程序而言可能会忘了设置中断向量表.
参数:(cx)= 循环次数,(bx)= 位移
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后cs、ip和栈中的状态。
在屏幕中间显示80个‘!’
assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se;设置从标号se到s的转移位移
mov cx,80
s: mov byte ptr es:[di],'!'
add di,2
int 7ch ;如果(ch)!=0,转移到标号s处
se: nop
mov ax,4c00h
int 21h
code ends
end start
;--------------------int 7ch中断安装例程--------------------------------------
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset sub_loop
mov ax,0
mov es,ax
mov di,200h
mov cx,offset sub_loopend - offset sub_loop
cld
rep movsb
mov ax,0
mov es,ax
mov es:[7ch*4],200h
mov es:[7ch*4+2],0
mov ax,4c00h
int 21h
sub_loop:push bp
dec cx
jcxz ok
mov bp,sp
add ss:[bp+2],bx
ok: pop bp
iret
sub_loopend:nop
code ends
end start
总结:
遇到的问题:无法显示字符串"!!!!!!(80个)"
解决方法:用测试程序调试,发现调用int 7ch中断例程后程序的指向不正确
找到以下逻辑错误(非语法错误),都是中断例程安装时的问题:
1.mov si,sub_loop 忘了offset操作符,反汇编了一下发现有无操作符offset对生成的机器码没有影响,
程序照样能正确的跑起来.
2.mov si,200h 应该改为mov di,200h,因为后边用了串传送指令,默认的目的地址在es:[di]中.
收获: 1.编写程序到底是一口气先写完了再添加注释,还是边写边添加注释,我自己的看法是前者节省时间,
思路不易被打断,写完了会比较爽.但是出了问题查错比较麻烦,后者与其相反.到底采用哪种方式,还在思索中...
2.编程的时候最好先把框架搭建起来,里面可以有中文的描述(称其为伪代码),这样不易漏掉东西,比如就
这个程序而言可能会忘了设置中断向量表.