|
10鱼币
;任务:安装一个新的int 7ch中断例程
;功能:为显示输出提供功能子程序
;参数:ah传递功能号;0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行,对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
答案给的代码·
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset s ;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di指向目标地址
mov cx,offset send-offset s ;设置cx为传输长度
cld ;设置传输方向为正
rep movsb
;在中断向量表中设置新的int 7ch中断例程的入口地址
cli ;设置IF=0屏蔽中断
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
sti ;设置IF=1不屏蔽中断
;结束
mov ax,4c00h
int 21h
;新的int 7ch中断例程
s: jmp short set
table dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h
set: push bx
cmp ah,3 ;判断ah中的功能号是否大于3
ja sret
mov bl,ah
mov bh,0
add bx,bx ;计算对应子程序在table表中的偏移
call word ptr table[bx] ;调用对应的功能子程序
sret: pop bx
iret
;功能:清屏
sub1: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
subles: mov byte ptr es:[bx],' '
add bx,2
loop subles
pop es
pop cx
pop bx
ret
;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub2: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s: and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
ret
;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub3: push ax
push bx
push cx
push es
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub3s: and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
pop ax
ret
;向上滚动一行
sub4: push cx
push si
push di
push es
push ds
mov si,0b800h
mov es,si
mov ds,si
mov si,160 ;ds:si指向第N+1行
mov di,0 ;es:di指向第N行
cld
mov cx,24 ;共复制24行
sub4s: push cx
mov cx,160
rep movsb ;复制
pop cx
loop sub4s
mov cx,80
sub4s1: mov byte ptr [160*24+si],' ' ;最后一行清空
add bx,2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
send: nop
code ends
end start
测试程序
assume cs:code
code segment
start: mov ax,303h
int 7ch
mov ax,4c00h
int 21h
code ends
end start
先编译连接运行第一个程序
然后再debug 测试程序·
然后就蹦出个对话框
the ntvdm cpu has encountered an illegalinstruction.
cs:0000 ip:0397 op:f0 53 ff 00 f0 choose 'close' to terminate application.
然后我就···XXXXX · ·
哪位大神告诉我到底神马情况·····或者告诉我到底该怎么做才能实现应得的效果···
|
最佳答案
查看完整内容
你先把虚拟机弄起来再说吧。百度一下有很多虚拟机装dos的教程。多看看。然后在实模式下也就是纯dos下运行这程序。后面的几章都要实模式下运行,windows下的debug做不到实模式。
|