|
主题 : : 课设2 极“瘦身”后为何能“躲过”被覆盖 [已解决] |
回复[ 2次 ]
点击[ 420次 ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
assume cs:code
code segment
mov bx,offset MyData ;共351b写入软盘
mov ax,cs
mov es,ax
mov ax,0301h
mov cx,0001h
mov dx,0000h
int 13h
mov ax,4c00h
int 21h
MyData:jmp short MyCode ;首址 7C00h
db '1) Reset pc 2) Start system 3) Clock 4) Set clock$';首址 7C02h
db 9,9,5,8,8,5,7,7,5,4,4,5,2,2,5,0,0,5, 0,0,0FFh,0FFh ;首址 7C34h
db '2000/00/00 00:00:00$',10h ;首址/尾址 7C4Ah/7C5Eh
MyCode: mov bx,0B800h
mov es,bx
call CLS
mov si,7C02h
mov bx,0007h ;页号/颜色
mov dx,0C0Fh
call ShowString ;显示主界面
mov ah,0
int 16h ;读、转
call CLS
cmp al,33h
jnb IsClock
cmp al,32h
je StartSystem
ResetPc:jmp dword ptr cs:[7C46h] ;1) Reset pc
StartSystem: sub ax,ax ;2) Start system
mov es,ax
mov bx,7C00h ;没覆盖 ?
mov ax,0201h
mov cx,0001h
mov dx,0080h
int 13h
jmp bx
IsClock:ja SetClock
Clock: call Time ;3) Clock
in al,60h
cmp al,1h
je ResetPc ;Esc返回
cmp al,3Bh ;F1键
jne Clock
inc bl ;变色
and bl,7
jmp Clock
SetClock:call Time ;4) Set clock
H_key: mov si,dx
and si,00FFh
mov bp,si
add si,si
add si,12*160
mov byte ptr es:[si].1,5Fh ;着色
mov al,cs:[bp].7C13h ;[bp].7C13h=[(bp-33)+7C34h]
out 70h,al
in al,71h
mov ch,al
mov ah,0
int 16h
cmp ah,4Dh ;“→”右移
je ShiftRight
cmp ah,1
je ResetPc ;Esc返回
and al,0Fh
cmp byte ptr cs:7C13h[bp].1,5
jne Tdigit
and ch,0F0h ;抹去个位数
Wri_in: or al,ch
out 71h,al
jmp SetClock
Tdigit: mov cl,4
shl al,cl
and ch,0Fh ;抹去十位数
jmp Wri_in
ShiftRight: inc dl
mov byte ptr es:[si].1,7 ;脱色
jmp H_key
CLS: sub bp,bp ;① CLS (任务:清屏)
mov cx,25*80
CLS_s: mov byte ptr es:[bp],' '
add bp,2
loop CLS_s
ret
ShowString: mov al,cs:[si] ;② ShowString (任务:显示字符串)
inc si
cmp al,'$'
je ShOver
mov ah,2
int 10h
mov ah,9
mov cx,1
int 10h
inc dl
jmp ShowString
ShOver: mov dl,1Fh
ret
Time: sub bp,bp ;③ Time (任务:显示时间)
Time_s: mov al,cs:[bp].7C34h
out 70h,al
in al,71h
mov word ptr cs:[bp].7C4Ch,3030h
sub ah,ah
div byte ptr cs:[7C5Eh]
add cs:[bp].7C4Ch,ax
add bp,3
cmp bp,18
jb Time_s
mov dx,0C1Fh
mov si,7C4Ah
call ShowString
ret
code ends
end | | |