comment ;
这个程序是学王爽老师的汇编以来第一次遇到难题,而且还无从下手。
debug了数次无果,最后参考了一下其他网友的经验,才得知以下知识点
1、数据标号table在编译时被赋予的偏移地址是相对于安装程序的,所以把它放在整个程序的开头
2、同时修改7ch的中断向量表时,(cs)=20h,(ip)=0,这样方便根据偏移找到table
;
assume cs:code
code segment
;----------------重写中断--------------
begin:
jmp short fun
table dw sub1,sub2,sub3,sub4
fun:
push bx
push ds
push cx
push dx
cmp ah,3
ja return
mov bl,ah
mov bh,0
add bx,bx
mov dx,offset table
call word ptr table[bx]
return:
pop dx
pop cx
pop ds
pop bx
iret
;--------------清屏子程序-------------------
sub1:
mov ax,0b800h
mov ds,ax
mov bx,0
mov cx,2000
mov al,' '
s:
mov [bx],al
add bx,2
loop s
ret
;--------------设置前景子程序---------------
;al的低三位控制前景色
sub2:
mov bx,0b800h
mov ds,bx
mov bx,1
mov cx,2000
color:
mov [bx],al
add bx,2
loop color
ret
;---------------设置背景色-----------------
;al的4 5 6 位控制背景色
sub3:
mov bx,0b800h
mov ds,bx
mov bx,1
mov cl,4
shl al,cl
mov cx,2000
bk:
mov [bx],al
add bx,2
loop bk
ret
;--------------滚屏-----------------------
sub4:
mov bx,0b800h
mov ds,bx
mov bx,0
mov cx,24
row:
mov dx,cx
mov cx,80
col:
mov ax,[bx+160]
mov [bx],ax
add bx,2
loop col
mov cx,dx
loop row
mov cx,80
mov al,' '
mov bx,160*24
tail:
mov [bx],al
add bx,2
loop tail
ret
over: nop
;--------------------------安装和测试程序-----------------
start:
mov ax,cs
mov ds,ax
mov si,offset begin
mov ax,0
mov es,ax
mov di,200h
mov cx,offset over - offset begin
cld
rep movsb
;修改向量表
;中断程序被调用时,table[bx]默认的段存器为cs,所以在安装程序中设置中断向量表时
;应设:cs=20h,ip=0,而不是cs=0,ip=200h
cli
mov word ptr es:[4*7ch],0
mov word ptr es:[4*7ch+2],20h
sti
;测试程序
mov ax,0b800h
mov ds,ax
mov bx,0
mov al,'a'
mov cx,2000
l:
mov [bx],al
add bx,2
loop l
mov ah,1
int 21h
;测试1号功能
mov ah,1
mov al,2
int 7ch
mov ah,1
int 21h
;测试2号功能
mov ah,2
mov al,2
int 7ch
mov ah,1
int 21h
;测试3号共能
mov ah,3
int 7ch
mov ah,1
int 21h
;测试0号功能
mov ah,0
int 7ch
mov ah,1
int 21h
;退出
mov ax,4c00h
int 21h
code ends
end start
- [cutebe] 相当牛,这个苦思冥想也值了。^_^ 11/30 00:00
- [parse] 如果忽略消息循环,那么操作系统加载的程序很快就执行完了,就像DOS程序一闪而过,所以CPU会空闲下来 06/30 09:04
- [游客] 楼主好厉害,挺一下! 01/19 08:43
- [游客] 很不错。 01/04 18:36
- [chinatree] 潜力贴留名,沙发。 11/08 12:58
- [youthangel] 恩,这次对了 10/30 18:56
- [fpamc] mov bx,18 在这条指令的上边是不是要加一条sub dx,dx? 10/30 10:03
- [fpamc] 对的 10/27 11:19
- [fpamc] 对的 10/27 09:00
- [fpamc] 哦,对不起,看错了。实验13也有一个7ch中断 10/27 08:52
- [游客] 现在急需一个汇编大作业。。。。。。可以么。。。。。如果今天之内看见留言 就加 1765496715 12/28 16:52
- [youthangel] 这算是对我学习的鼓励吗?谢谢!咱们这样交流就可以了 10/11 15:48
- [fpamc] 多日观察,你的学习积极性挺高的。可以来我们群了。群号:75916434 10/11 10:58