鱼C论坛

 找回密码
 立即注册
查看: 2415|回复: 0

[汇编作业] 课程设计2

[复制链接]
发表于 2017-6-1 18:05:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
很久以前完成的代码。
由于当时水平限制没办法弄成启动盘。所以代码还不完善,但是能在dos下运行,现在也懒得修改了。
写修改时间的代码很困难,windows妈妈不让直接写端口,只能变通处理,幸好能够修改成功。
发上来给后边学习的朋友有困难时看能不能参考一下
assume cs:code 
 

code segment

setup: mov ax,cs           ;将主程序写入磁盘2扇区
       mov es,ax
           
calc:  mov ax,offset zhuc-offset n_in9ok
       mov dx,0
       mov bx,512
       div bx
       cmp dx,0
       jne adal
       jmp short set             
adal:  inc al     ;计算出需要的扇区数
           
set:   mov bx,offset zhuc 
       mov ah,3   ;写入
           mov ch,0   ;磁道号
           mov cl,2   ;扇区号
           mov dh,0   ;磁头号(面号)
           mov dl,0   ;没有软盘,能否写到81h ;驱动器号(D盘)
           int 13h
           
           mov bx,offset lead  ;将引导程序写入磁盘1扇区
           mov al,1
           mov ah,3   ;写入
           mov ch,0   ;磁道号
           mov cl,1   ;扇区号
           mov dh,0   ;磁头号(面号)
           mov dl,0   ;没有软盘,能否写到81h ;驱动器号(D盘)
           int 13h
           
lead:  mov ax,0      ;程序引导部分 ,负责将主程序写入到引导程序之后的内存
       mov es,ax
       mov ax,offset zhuc-offset n_in9ok ;根据主程序长度计算al 
       mov dx,0
       mov bx,512
       div bx
       cmp dx,0
       jne ada2
       jmp short set1           
ada2:  inc al

set1:  mov bx,offset zhuc-offset lead ; 
           add bx,7c00h
       mov ah,2   ;读盘
           mov ch,0   ;磁道号
           mov cl,2   ;扇区号
           mov dh,0   ;磁头号(面号)
           mov dl,0   ;没有软盘,能否用D盘
           int 13h 

zhuc:  jmp short start           
stack segment 
    db 64 dup (0)
stack ends
start:   mov ax,stack 
         mov ss,ax 
                 mov sp,64
                 jmp short s 

d1 db '1)reset pc',0
d2 db '2)start system',0
d3 db '3)clock',0
d4 db '4)set clock',0
d5 dw x1,x2,x3,x4
d6 db 'Esc)return',0
d7 db 'F1 )change colors',0
d8 db 'time setting error',0
s:       mov ax,cs      ;显示选项
                 mov ds,ax
                 mov ax,0b800h
                 mov es,ax
                 mov di,0
                 mov cx,2000
sq:                 mov byte ptr es:[di],' '   ;清屏
                 inc di
                 mov byte ptr es:[di],7
                 inc di
                 loop sq 
                 mov si,offset d1
                 mov dh,10
                 mov dl,33
                 mov bl,7
                 call show 
                 mov si,offset d2
                 inc dh  
                 call show 
                 mov si,offset d3
                 inc dh
                 call show 
                 mov si,offset d4
                 inc dh
                 call show 
                 
s1:                 mov ah,0   ;等待输入
                 int 16h
                 cmp al,31h
                 jb s1
                 cmp al,34h
                 ja s1
         mov bl,al ;直接定址
                 sub bl,31h
                 mov bh,0
                 add bx,bx
                 jmp cs:d5[bx]
                 
x1:      mov ax,0ffffh
         push ax 
         mov ax,0
         push ax
                 mov bp,sp
                 jmp dword ptr ss:[bp]
                 
                 
x2:                 mov ax,0
         mov es,ax
         mov bx,200h
         mov al,1
             mov ah,2   ;读盘
             mov ch,0   ;磁道号
             mov cl,1   ;扇区号
             mov dh,0   ;磁头号(面号)
             mov dl,80h ;c盘
             int 13h
         push bx 
         push es 
         mov bx,sp                  
             jmp dword ptr ss:[bx]

x3:                 mov si,offset d3
                 mov dh,12
                 mov dl,33
                 mov bh,0
                 mov bl,es:[1]
                 or bl,00001000b
                 call show  ; 使第三选项高亮
                 mov si,offset d6
                 mov dh,1
                 mov dl,60
                 mov bl,es:[1]
                 call show  ;增加Esc提示
                 mov si,offset d7
                 inc dh 
                 call show  ;增加F1提示
                 
x3a:         in al,60h
                 cmp al,81h
                 je x3b    ;回到初始
                 cmp al,3bh
                 je x31  ;跳至变色
                 call tm
                 mov si,offset td2
                 mov dh,24
                 mov dl,60
                 mov bh,1  ; bh不等于0时,不设置颜色属性
                 call show
                 jmp short x3
x3b:     mov al,0
         out 60h,al
         jmp near ptr s
 
x31:         mov ax,0b800h
                 out 60h,al      ;很重要,调零60h端口的数值(这个设置到底有什么用还不太清楚,只知道不设置的话按F1就乱变色)
                 mov es,ax 
                 mov di,1
                 mov cx,2000
         cmp byte ptr es:[di],1
                 je x33
x32:     dec byte ptr es:[di]
                 add di,2
                 loop x32
                 jmp near ptr x3a
             
x33:     mov byte ptr es:[di],7
                 add di,2
                 loop x33 
                 jmp near ptr x3a

x4:      mov ax,0
                 mov es,ax
                 mov di,208h
                 push es:[9h*4+2]
                 push es:[9h*4]
                 pop es:[200h]
                 pop es:[200h+2]
                 mov word ptr es:[204h],0ffh 
                 mov word ptr es:[206h],0ffh
                 
                 mov ax,cs 
                 mov ds,ax 
                 mov si,offset n_in9
                 mov cx,offset n_in9ok-offset n_in9
         cld                  
                 rep movsb
                 
                 cli
                 mov word ptr es:[9h*4],208h
                 mov word ptr es:[9h*4+2],0
                 sti

         mov si,offset d4 ; 修改时间主程序
                 mov ax,0b800h
                 mov es,ax 
                 mov dh,13
                 mov dl,33
                 mov bh,0
                 mov bl,es:[1]
                 or bl,00001000b
                 call show  ; 使第四选项高亮
                 mov byte ptr cs:td2[20],0
                 jmp short x4s
                 x4d3 dw tent,tz,ty,tesc,tz,ty
x4s:         call tm  ;查询时间
x4t:     call tbm ;比对时间,并保存到td3
                 mov si,offset td3
                 mov dh,24
                 mov dl,60
                 mov bh,1  ; bh不等于0时,不设置颜色属性
                 call show
                 mov di,0f77h;设置查询首地址
                 call cw  ;查亮度所对应的字符串位置(假如没有高亮位设置bl=0),保存到bl(38)
                 call zz  ;BL位时间高亮,自动往后跳过非数字位,保存bl(38)
                  
                 mov ax,0
                 mov es,ax 
                 cmp byte ptr es:[204h],0ffh
                 jne x4x  ;数字键程序
                 cmp byte ptr es:[206h],0ffh
                 jne x4g  ;功能键程序
                 mov bh,1
                 jmp short x4t 
                 
x4x:         mov di,0f77h
         call cw 
                 call tn
                 call ty
                 call zz
                 mov bh,1
                 jmp short x4t    
                 
x4g:         mov bl,es:[206h]
         add bl,bl 
                 mov bh,0
                 mov byte ptr es:[206h],0ffh
                 call x4d3[bx]
                 mov bh,1
                 jmp short x4t

                 
tent:         mov ax,0
                 mov es,ax
                 mov byte ptr es:[206h],0ffh
                 push es:[200h+2]
                 push es:[200h]
                 pop es:[9h*4]
                 pop es:[9h*4+2]
                 mov al,0
                 out 60h,al
                 mov ax,0b800h
                 mov es,ax
                 mov di,1
                 mov cx,2000
tenq:         mov byte ptr es:[di],7
                 add di,2
                 loop tenq
                 jmp near ptr x3
                 
tz:                 mov di,0f77h
         mov ax,0b800h
                 mov es,ax 
                 call cw
         cmp bx,0
                 je tz1
tz2:         sub bx,2
                 cmp byte ptr es:[di+bx-1],30h
                 jb tz2 
                 cmp byte ptr es:[di+bx-1],39h
                 ja  tz2
                 call zz
                 ret 
tz1:         mov bx,36
                 call zz
                 ret
ty:                 mov di,0f77h
         call cw
         cmp bx,36
                 je ty1
                 add bx,2
                 call zz
                 ret 
ty1:         mov bx,0
                 call zz
                 ret
                 
tesc:         mov ax,0
                 mov es,ax
                 mov byte ptr es:[206h],0ffh
                 push es:[200h+2]
                 push es:[200h]
                 pop es:[9h*4]
                 pop es:[9h*4+2]
                 mov al,0
                 out 60h,al
                 jmp near ptr s

                 
tm:             push bx ;  查询并保存时间子程序 (直接循环显示时间没法应用中断,应在主程序设置条件循环)
         push si
                 push cx
                 push ax
             push di 
                 
                 jmp short ti
     td1 db 9,8,7,4,2,0 
     td2 db '20yy/mm/dd hh:mm:ss',0,0
         td3 db '20yy/mm/dd hh:mm:ss',0,0 
ti:      mov di,0
                 mov si,2
                 mov cx,6
tii:         push cx 
             mov al,cs:td1[di]
                 out 70h,al
                 in al,71h
                 mov ah,al
                 mov cl,4
                 shr al,cl 
                 and ah,00001111b
                 add ax,3030h
                 mov word ptr cs:td2[si],ax
                 cmp byte ptr cs:td2[20],0
                 jne tiii
                 mov word ptr cs:td3[si],ax
tiii:         inc di 
                 add si,3
                 pop cx 
                 loop tii
                 
                 pop di 
                 pop ax 
                 pop cx 
                 pop si
                 pop bx 
             ret
        
tbm:         push bx ;  
         push si
                 push cx
                 push ax
                 push di 
                 
         mov si,18
                 
tbii:         mov al,0
                 out 70h,al
                 in al,71h
                 mov ah,al
                 mov cl,4
                 shr al,cl 
                 and ah,00001111b
                 add ax,3030h
                 cmp byte ptr cs:td2[si],ah
                 jne tbiii
                 jmp short tbme
                 
tbiii:                mov byte ptr cs:td2[20],1
                    call tm
            cmp td3[si],39h
                    jne jia
                        mov td3[si],30h
            dec si
                    cmp td3[si],35h
                        jne jia
                        mov td3[si],30h
                        dec si
                        dec si
                        cmp td3[si],39h
                        jne jia
                        mov td3[si],30h
                        dec si
                        cmp td3[si],35h
                        jne jia
                        mov td3[si],30h
                        dec si
                        dec si
                        cmp word ptr td3[si-1],3332h
                        je jia0
                        cmp byte ptr td3[si],39h
                        jne jia
                        mov td3[si],30h
                        dec si
                        inc td3[si]
                        jmp short tbme
                        
jia0:       mov word ptr td3[si-1],3030h
            call luna
                        jmp short tbme
jia:                inc td3[si]                  
                 
tbme:         pop di 
                 pop ax 
                 pop cx 
                 pop si
                 pop bx 
             ret                 
                 
show:    push ax ; 显示以0结尾的字符串程序 dx=行列 cs:[si]=字符串起点 bl=颜色 bh不等于0时 不设置颜色
                 push di
                 push cx
                 push si
                 push dx
                 
                 mov ax,0b800h
                 mov es,ax 
                 mov ax,160
                 mul dh
                 add dl,dl
                 sub dl,2
                 mov dh,0
                 add ax,dx
                 mov di,ax 
sh1:         mov cl,cs:[si]
                 jcxz sh2
                 mov es:[di],cl
                 inc di
                 cmp bh,0
                 jne sh_nc
                 mov es:[di],bl 
sh_nc:         inc si
                 inc di 
                 jmp short sh1
                 
sh2:         pop dx 
         pop si
         pop cx
                 pop di
                 pop ax
         ret

cw:                push ax ; 查亮度子程序(cw),保存至bl?,  参数:es:[di] 为查询字符串的首地址
                push es 
                push cx 
                mov bx,0b800h
                mov es,bx 
                mov bx,0
                mov cx,19
                
c1:                mov al,es:[di+bx]
        and al,00001000b
                cmp al,00001000b
                je c2
                add bx,2
                loop c1
                mov bx,0
c2:                pop cx 
        pop es
        pop ax 
        ret

zz:                push bp     ;高亮时间子程序,bl为高亮位,能自动跳过非数字位。参数:di为时间首地址
        push ax 
                push cx 
                mov ax,0b800h  
                mov es,ax
                mov bp,0
        mov cx,19
z1:     and byte ptr es:[di][bp],11110111b
                add bp,2
                loop z1                
                cmp byte ptr es:[di+bx-1],30h
                jb z3
                cmp byte ptr es:[di+bx-1],39h
                ja z3
z2:     or byte ptr es:[di][bx],00001000b
                pop cx
                pop ax
                pop bp
                ret 
z3:                add bx,2
                jmp z2

tn:      push ax ; 时间修改程序 
                 push bx
                 mov bp,sp  ;保存栈位置
                 push word ptr cs:td3[5]
                 push word ptr cs:td3[8]
                 push word ptr cs:td3[11]
                 push word ptr cs:td3[14]
                 push word ptr cs:td3[17]
                 
                 mov ax,bx 
         mov bl,2
                 div bl
                 mov bh,0
                 mov bl,al
                 mov al,es:[204h]
tng:         mov cs:td3[bx],al 
              push ax 
                 push bx 
                 
                 mov bl,10
                 mov di,5
                 mov cx,5
tngs:         sub word ptr cs:td3[di],3030h
                 add di,3
                 loop tngs
                 
                 mov cx,5
                 mov di,5
tngs1:         mov al,td3[di]
                 mul bl 
                 add al,cs:td3[di+1]
                 mov td3[di],al
                 add di,3
                 loop tngs1
                                  
                 mov ax,0b800h
                 mov es,ax 
                 mov di,0e36h
                 mov cx,20
tngx:         mov byte ptr es:[di],' '
                 add di,2
                 loop tngx 
                 
                 call ttest
                 pop bx
         pop ax
                 pop word ptr cs:td3[17]
                 pop word ptr cs:td3[14]
                 pop word ptr cs:td3[11]
                 pop word ptr cs:td3[8]
                 pop word ptr cs:td3[5]
                 mov cs:td3[bx],al
                 
tne:         mov ax,0
         mov es,ax 
         mov word ptr es:[204h],0ffh
         mov sp,bp
                 pop bx 
                 pop ax 
                 ret 
                                  
ttest:         cmp byte ptr cs:td3[5],12 ;看月份是否大于12
                 ja tns 
                 cmp byte ptr cs:td3[8],31 ;看日期是否大于31
                 ja tns 
                 cmp byte ptr cs:td3[5],2 ;看月份是否2月
                 je ttest1
                 
                 mov si,0
                 mov cx,4
                 jmp short ttxiao
monn db 4,6,9,11
ttxiao:         mov al,cs:monn[si]  ;看月份是否小月
         cmp byte ptr cs:td3[5],al
                 je ttest2
                 add si,2
                 loop ttxiao
                 
                 cmp byte ptr cs:td3[11],23
                 ja tns
                 cmp byte ptr cs:td3[14],59
                 ja tns 
                 cmp byte ptr cs:td3[17],59
                 ja tns
                 ret 
ttest1:         call runnian 
         cmp cs:td3[20],0    ;看是否闰年
                 je ttest1_1
                 cmp byte ptr cs:td3[8],28 ;看日期是否大于28 
                 ja tns 
                 ret 
ttest1_1: cmp byte ptr cs:td3[8],29;看日期是否大于29
                 ja tns 
                 ret 
ttest2:         cmp byte ptr cs:td3[8],30 ;看日期是否大于30 
                 ja tns
                 ret
tns:         mov si,offset d8
                 mov dh,22
                 mov dl,60
                 mov bh,1
                 call show
         pop ax         ; 多一个Pop 因为是跳到这里来的 栈里存了原ip         
                 pop bx 
                 pop ax 
                 pop word ptr cs:td3[17]
                 pop word ptr cs:td3[14]
                 pop word ptr cs:td3[11]
                 pop word ptr cs:td3[8]
                 pop word ptr cs:td3[5]
                 jmp near ptr tne
                 
tn1:     push ax ; 时间修改程序 
                 push bx
                 mov ax,bx 
         mov bl,2
                 div bl
                 mov bh,0
                 mov bl,al
                 mov al,es:[204h]
                 mov word ptr es:[204h],0ffh
                 mov cs:td3[bx],al 
                 pop bx 
                 pop ax 
                 ret
                 
luna:    jmp short lunas
mon  dw 3430h,3630h,3930h,3131h
lunas:         mov cx,4
                 mov bp,3133h  ;设置成31号
                 mov si,0
cmp_m:         mov ax,cs:mon[si]
         cmp word ptr cs:td3[5],ax   ; 看是不是小月
                 je xiaoyue 
                 add si,2
                 loop cmp_m
                 cmp word ptr cs:td3[5],3230h  ; 看是不是2月
                 je eryue
         jmp short dayue 

xiaoyue: mov bp,3033h         ;设置成30号
         jmp short dayue 
                 
eryue:   call runnian     ;查是不是闰年,闰年余数保存在cs:td3[20]
         cmp cs:td3[20],0 
                 je eryue1
                 mov bp,3832h
                 jmp short dayue
eryue1:         mov bp,3932h
                
                 
dayue:   cmp word ptr cs:td3[8],bp  ;看是多少号
         je dayue_1
         cmp byte ptr cs:td3[9],39h    ;看是不是9号
         je dayue_2
                 inc byte ptr cs:td3[9]
                 ret 
                 
dayue_1: mov word ptr cs:td3[8],3130h  ;是月底号就改成1号
                 cmp word ptr cs:td3[5],3231h  ; 看是不是12月
                 je dayue12
                 cmp byte ptr cs:td3[6],39h    ; 看是不是9月
                 je dayue11
                 inc byte ptr cs:td3[6]
                 ret
                 
dayue_2: inc byte ptr cs:td3[8]       ; 因为前一位不是3,所以是9让前一位加1
                 mov byte ptr cs:td3[9],30h   ; 然后自己变成0
                 ret
                 
dayue11: mov word ptr cs:td3[5],3031h  ;是9月就改成10月
                 ret 
                 
dayue12: mov word ptr cs:td3[5],3130h ; 是12月就改成1月
                 cmp byte ptr cs:td3[3],39h  ; 看是不是第9年
                 je dayue13
                 inc byte ptr cs:td3[3]
                 ret 
                 
dayue13: mov byte ptr cs:td3[3],30h   ; 是第9年就改成0年
                 cmp byte ptr cs:td3[2],39h   ; 看是不是第9年
                 je dayue14
                 inc byte ptr cs:td3[2]
                 ret 
                 
dayue14: mov byte ptr cs:td3[2],30h  ; 是第9年就改成0年
                 cmp byte ptr cs:td3[1],39h  ; 看是不是第9年
         je dayue15
                 inc byte ptr cs:td3[1]
                 ret 
                 
dayue15: mov byte ptr cs:td3[1],30h  ; 是第9年就改成0年
                 cmp byte ptr cs:td3[0],39h  ; 看是不是第9年
                 je dayue16
                 inc byte ptr cs:td3[0]
                 ret 
dayue16: mov byte ptr cs:td3[0],30h   ; 是第9年就改成0年 
                 ret
                                  
runnian:        push ax     ;闰年查询子程序 ,余数存入cs:td3[20]
            push bx
                        push dx 
                        push word ptr cs:td3[0]
                        push word ptr cs:td3[2]
                        sub word ptr cs:td3[0],3030h
                        sub word ptr cs:td3[2],3030h
                        mov al,cs:td3[2]
                    mov bl,10
                        mul bl 
                        add al,cs:td3[3]
                        mov cs:td3[2],al   ;46
                        mov cs:td3[3],0
                        mov al,cs:td3[1]
                        mov bl,100
                        mul bl
                        add word ptr cs:td3[2],ax
                        mov al,cs:td3[0]
                        mov ah,0
                        mov bx,1000
                        mul bx
                        add ax,word ptr cs:td3[2]
                        mov bx,4
                        mov dx,0
                        div bx 
                        mov cs:td3[20],dl 
                        pop word ptr cs:td3[2]
                        pop word ptr cs:td3[0]
                        pop dx
                        pop bx
                        pop ax
                        ret
                        
n_in9:                          ;待安装的int9中断例程 ,功能是比对是否制定的按键,并存入数据段内存的指定区域
         push ax
                 push bx 
                 push cx 
                 push si 
                 push di 
                 
                 in al,60h
                 pushf
                 call dword ptr cs:[200h]
                 jmp short n
        ind1 db 2,3,4,5,6,7,8,9,0ah,0bh
        ind2 db 1ch,4bh,4dh,1,0eh,0fh
                 
n:                 mov si,offset ind1-offset n_in9
                 mov di,offset ind2-offset n_in9
                 mov cx,10
                 mov bx,0
n1:                 cmp al,cs:[si+208h][bx]
                 je in16
                 inc bx
                 loop n1
                 
                 mov bx,0
                 mov cx,6
n2:                 cmp al,cs:[di+208h][bx]
                 je gnj 
                 inc bx 
                 loop n2
                 jmp short n_end ;不是上列按键即返回

in16:    cmp al,0bh
         je in16_2
                 add al,2fh
in16_1:  mov cs:[204h],al   ;数字键转换ASCII码后存入205
                 jmp short n_end
in16_2:         add al,25h
         jmp short in16_1
                 
gnj:                     ;功能键参数保存到1
         mov cs:[206h],bl ; (4)位
n_end:         pop di 
         pop si 
         pop cx 
         pop bx 
                 pop ax 
         iret         
                 
n_in9ok:                 nop


                  code ends 
                 end setup
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表