荣誉值:2
信誉值:0
注册日期:2009-02-10 14:31 |
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,cs
mov es,ax
mov bx,offset string
mov al,2
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21h
org 7c00h
string: jmp short begin
str1 db 'welcome to masm!',0
str2 db '/','/',' ',':',':',0
str3 db 9,8,7,4,2,0
str4 db '1) reset pc',0
str5 db '2) start system',0
str6 db '3) clock',0
str7 db '4) set clock',0
str dw str1,str2,str3,str4,str5,str6,str7
save dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0
begin: mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
sss_cls:
mov byte ptr es:[bx],' '
add bx,2
loop sss_cls
mov ah,2
mov bh,0
mov dh,10
mov dl,0
int 10h
mov save[0],offset begin
mov save[2],cs
mov ax,0b800h
mov ds,ax
mov bx,0
mov si,0
mov di,0
mov bp,0
mov dx,0
mov cx,0
mov ax,0
mov es,ax
s_show: mov bx,str[6+bp]
mov al,cs:[bx+si]
cmp al,0
je end_str
mov ds:[di],al
mov byte ptr ds:[di+1],2
inc si
add di,2
jmp short s_show
end_str: add di,160
add bp,2
add si,si
sub di,si
sub si,si
inc dx
cmp dx,4
jne s_show
getstr: push ax
getstrs: mov ah,0
int 16h
cmp ah,5
ja getstrs
call shell
jmp short getstrs
shell: jmp short system
table dw reset_pc,start_system,clock,set_cls ;这里跳转不到set_cls郁闷怎么解决..
save1 db 0,0,0,0,0,0,0,0,0,0,0,0,0
system: sub ah,2
mov bl,ah
sub bh,bh
add bx,bx
jmp word ptr table[bx]
reset_pc: mov ax,0ffffh
push ax
mov ax,0
push ax
retf
start_system: push ax
reads: mov ah,0
int 16h
cmp al,20h
jb no_char
mov ah,0
call charstack
mov ah,2
mov dh,7
mov dl,0
call charstack
jmp reads
no_char: cmp ah,1ch
jne reads
mov ah,3
call charstack
pop ax
ret
charstack: jmp short charstart
tab1 dw charpush,charpop,charshow,char_xie
top dw 0
charstart: push bx
push dx
push di
push es
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr tab1[bx]
charpush:mov bx,top
mov byte ptr save1[bx],al
inc top
jmp sret
charpop:
charshow: mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0
charshows:cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty: mov al,save1[bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
char_xie: mov bx,0
mov dl,save1[bx]
mov dh,save1[bx+1]
sub dl,30h
sub dh,30h
mov cl,4
shl dh,cl
or dh,dl
mov al,9
out 70h,al
mov al,dh
out 71h,al
mov al,9
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov bx,0b800h
mov es,bx
mov byte ptr es:[12*160],al
mov byte ptr es:[12*160+2],ah
sret:pop es
pop di
pop dx
pop bx
ret
clock: ; mov save[0],offset string
; mov save[2],cs
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s_cls: mov byte ptr es:[bx],' '
add bx,2
loop s_cls
a_int9:
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti
mov ax,0
mov es,ax
mov bx,7c00h+200h
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h
jmp short capital
int9: push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,3bh
je red1
cmp al,1
je esc1
jmp short int9ret
esc1: ; push save[2]
; push save[0]
; retf
pop es
pop cx
pop bx
pop ax
push bp
mov bp,sp
push save[2]
pop ax
mov ss:[bp],ax
push save[0]
pop ax
mov ss:[bp+2],ax
pop bp
iret
red1:
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,28
s: inc byte ptr es:[bx+160*10]
add bx,2
; cmp bx,2001
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end: nop
capital:
mov ax,0b800h
mov ds,ax
mov bx,str
mov si,0
mov di,160*10
s_date:
mov al,str3[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov ds:[di],ah
mov ds:[di+2],al
mov al,str2[si]
mov ds:[di+4],al
add di,6
inc si
cmp si,6
jne s_date
jmp short capital
set_cls: mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
ss1_cls: mov byte ptr es:[bx],' '
add bx,2
loop ss1_cls
ret
code ends
end start | | |