📄 i.asm
字号:
assume cs:code,ds:data
data segment
dw 0,2,4,7,8,9
db 128 dup (0)
data ends
wolf segment
db "I LOVE WOLF_SEVEN$"
wolf ends
data2 segment
dw 9,8,7,4,2,0
data2 ends
code segment
start:push cs
pop es
mov bx,offset NewStart1
mov al,8
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21h
NewStart1:jmp short NewStart2
s0 db '(1) reset dos $'
s1 db '(2) start system $'
s2 db '(3) clock $'
s3 db '(4) set clock $'
s dw offset s0,offset s1,offset s2,offset s3
NewStart2:
mov ax,code
mov ds,ax
show0:mov si,offset s ;ds dx显示字符串开始坐标。
mov bh,0 ;第0页
mov dh,10 ;行号
mov dl,10 ;列号
mov cx,4 ;----------显示4条选项------------------------------------
show1:
mov ah,2 ;设置光标
int 10h
mov di,dx ;保存行号和列号。
mov dx,[si] ;显示字符串位置。
mov ah,9
int 21h ;显示行中第一条字符串
mov dx,di
inc dh
add si,2 ;为下一个循环显示data中字符串作准备。
loop show1 ;------------显示4条选项结束--------------------------------
mov ax,0b800h
;mov ax,wolf
mov es,ax
mov al,'h'
mov es:[160*5+120*2],al
mov ah,0
int 16h
mov bx,data ;保存显示主菜单地址
mov es,bx
mov bx,16
mov word ptr es:[bx],0ffffh
mov word ptr es:[bx+2],0
cmp al,'1'
je reset
mov bx,data ;保存显示主菜单地址
mov es,bx
mov bx,16
mov word ptr es:[bx],7c00h
mov word ptr es:[bx+2],0
cmp al,'2'
je startSystem
cmp al,'3'
je clock
cmp al,'4'
je setSystemClock
mov ax,4c00h
int 21h
;重起
reset:mov ax,data
mov es,ax
jmp dword ptr es:[16]
setSystemClock:
;进入硬盘操作系统
startSystem:mov ax,0
mov es,ax
mov bx,7c00h ;读到内存中的地址。
mov dl,0080h
mov ah,2 ;读磁盘操作
mov dh,0 ;0盘面
mov ch,0 ;0磁道
mov cl,1 ;1扇区
mov al,1 ;只读一个扇区
int 13h
call reset
clock: mov cx,1000
showstart:push cx
call delay
call showTime
pop cx
loop showstart
ret
showTime:mov si,data
mov ds,si
mov si,0
mov dx,70h
mov cx,6
ss0:mov al,[si]
out dx,al
in al,71h
push ax
add si,2
loop ss0
mov ax,0b800h
mov ds,ax
mov dh,0 ;行号
mov dl,0 ;列号
mov cl,3 ;颜色
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
add bx,ax
mov si,0
mov cx,2
ss1:pop ax ;写年、月
mov di,cx ;保存循环次数
call getNum
mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl
mov byte ptr [bx+2],al
mov [bx+3],cl
mov byte ptr [bx+4],"/"
mov [bx+5],cl
add bx,6
mov cx,di
loop ss1
pop ax ;写日
call getNum
mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl
mov byte ptr [bx+2],al
mov [bx+3],cl
add bx,6 ;空格
ss2:pop ax ;写时、分
mov di,cx ;保存循环次数
call getNum
mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl
mov byte ptr [bx+2],al
mov [bx+3],cl
mov byte ptr [bx+4],":"
mov [bx+5],cl
add bx,6
mov cx,di
loop ss2
pop ax ;写秒
call getNum
mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl
mov byte ptr [bx+2],al
mov [bx+3],cl
ret
getNum:mov cl,4
mov ah,al
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
ret
;延时
delay:push ax
push dx
mov dx,1000h
mov ax,0
sss1:sub ax,1
sbb dx,0
cmp ax,0
jne sss1
cmp dx,0
jne sss1
pop dx
pop ax
ret
clearscreen: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
subls: mov byte ptr es:[bx],' '
add bx,2
loop subls
pop es
pop cx
pop bx
ret
endsetup:nop
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -