|
主题 : : 总是出现“遇到无效指令“错误,不知道是什么原因? [已解决] |
回复[ 6次 ]
点击[ 632次 ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11 |
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128
mov ax,code
mov ds,ax
mov si,offset int7ch
mov ax,0
mov es,ax
mov di,204H
mov cx,offset allend-offset int7ch
cld
rep movsb
push es:[36]
push es:[38]
pop es:[202H]
pop es:[200H]
cli
mov word ptr es:[36],204h;调试到此总是有问题?
mov word ptr es:[38],0H
sti
mov ax,4c00h
int 21h
int7ch: jmp short int7chcode
table:dw cls,setcolor,setbkcolor,scroll
int7chcode:push bx
pushf
call dword ptr cs:[200H]
cmp ah,3
ja int7chend
mov bl,ah
mov bh,0
add bx,bx
call word ptr table[bx]
int7chend:pop bx
iret
cls:push ax
push es
push di
push cx
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000
loopcls:mov byte ptr es:[di],' '
inc di
inc di
loop loopcls
pop cx
pop di
pop es
pop ax
ret
setcolor:push es
push di
push cx
push ax
mov ax,0b800h
mov es,ax
mov di,1
mov cx,2000
pop ax
loopsetc:and byte ptr es:[di],11111000B
or byte ptr es:[di],al
add di,2
loop loopsetc
pop cx
pop di
pop es
ret
setbkcolor:push es
push di
push cx
push ax
mov ax,0b800h
mov es,ax
mov di,1
mov cx,2000
pop ax
shl al,1
shl al,1
shl al,1
shl al,1
loopsetbkc:and byte ptr es:[di],10001111B
or byte ptr es:[di],al
add di,2
loop loopsetbkc
pop cx
pop di
pop es
ret
scroll:push ax
push es
push di
push ds
push si
mov ax,0b800h
mov es,ax
mov ds,ax
mov di,0
mov si,160
mov cx,24
loopscroll:push cx
mov cx,160
cld
rep movsb
pop cx
loop loopscroll
mov cx,80
mov si,0
scrolllast:mov byte ptr [160*24+si],' '
add si,2
loop scrolllast
pop si
pop ds
pop di
pop es
pop ax
ret
allend:nop
code ends
end start | | |