鱼C论坛

 找回密码
 立即注册
查看: 3308|回复: 9

[汇编作业] 课程设计2

[复制链接]
发表于 2020-2-27 17:49:41 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code, ds:data

stack segment
        db 64 dup(0)
stack ends

data segment
buf     db 1024 dup(0)
old_mbr db 512 dup(0)
data ends

code segment
start:
        mov     ax, data
        mov     ds, ax
        mov     es, ax
        mov     ax, stack
        mov     ss, ax
        mov     sp, 64
        
        ; 读取硬盘的逻辑扇区0到old_mbr
        mov     bx, offset old_mbr
        mov     dx, 0080h
        mov     cx, 0001h
        mov     ax, 0201h
        int     13h
        
        ; 把old_mbr写到硬盘的逻辑扇区2
        mov     bx, offset old_mbr
        mov     dx, 0080h
        mov     cx, 0003h
        mov     ax, 0301h
        int     13h
        
        ; 复制mbr段到buf
        push    ds
        mov     ax, mbr
        mov     ds, ax
        mov     si, offset mbr_start
        mov     di, offset buf
        mov     cx, mbr_end - mbr_start
        cld
        rep     movsb
        pop     ds
        
        ; 备份被分区表和引导标志占用的内容
        mov     si, offset buf
        mov     di, offset buf
        add     si, 1beh
        add     di, offset swap_data
        mov     cx, 66
        cld
        rep     movsb
        
        ; 复制分区表和引导标志
        mov     si, offset old_mbr
        mov     di, offset buf
        add     si, 1beh
        add     di, 1beh
        mov     cx, 66
        cld
        rep     movsb
        
        ; 把buf写到硬盘的逻辑扇区0和逻辑扇区1
        mov     bx, offset buf
        mov     dx, 0080h
        mov     cx, 0001h
        mov     ax, 0302h
        int     13h
        
        ; jmp   far ptr 0f000h:0fff0h
        db      0eah
        dw      0fff0h
        dw      0f000h
        
        mov     ax, 4c00h
        int     21h
code ends

mbr segment
mbr_start:
        mov     ax, cs
        mov     ds, ax
        mov     es, ax
        mov     ss, ax
        mov     sp, 7c00h
        
        mov     si, 7c00h
        mov     di, 0600h
        mov     cx, 256
        cld
        rep     movsw
        
        ; jmp   far ptr 60h:migrate
        db      0eah
        dw      migrate
        dw      60h
migrate:
        mov     ax, cs
        mov     ds, ax
        mov     es, ax
        
        sti             ; 确保允许中断
        
        ; 读取硬盘的逻辑扇区1到当前代码后面
        mov     bx, 200h
        mov     dx, 0080h
        mov     cx, 0002h
        mov     ax, 0201h
        int     13h
        
        ; 恢复被分区表和引导标志占用的内容
        mov     si, offset swap_data
        mov     di, 1beh
        mov     cx, 66
        cld
        rep     movsb
        
main_loop:
        call    cls
        call    disp_menu
        call    getchar
        cmp     al, '1'
        jne     @f
        call    reset_pc
        jmp     end_switch
@@:
        cmp     al, '2'
        jne     @f
        call    start_system
        jmp     end_switch
@@:
        cmp     al, '3'
        jne     @f
        call    clock
        jmp     end_switch
@@:
        cmp     al, '4'
        jne     @f
        call    set_clock
        jmp     end_switch
@@:
        cmp     al, '5'
        jne     @f
        call    uninstall_this
        jmp     end_switch
@@:
end_switch:
        jmp     main_loop
        
disp_menu:
        push    ax
        push    bx
        push    cx
        push    dx
        push    bp
        
        mov     bp, menu
        mov     dx, 0a20h
        mov     cx, 11
        mov     bx, 0007h
        mov     ax, 1300h
        int     10h
        
        mov     bp, menu + 11
        mov     dx, 0b20h
        mov     cx, 15
        mov     bx, 0007h
        mov     ax, 1300h
        int     10h
        
        mov     bp, menu + 26
        mov     dx, 0c20h
        mov     cx, 8
        mov     bx, 0007h
        mov     ax, 1300h
        int     10h
        
        mov     bp, menu + 34
        mov     dx, 0d20h
        mov     cx, 12
        mov     bx, 0007h
        mov     ax, 1300h
        int     10h
        
        mov     bp, menu + 46
        mov     dx, 0e20h
        mov     cx, 17
        mov     bx, 0007h
        mov     ax, 1300h
        int     10h
        
        ; 设置光标到下一行
        mov     ah, 02h
        mov     bh, 0
        mov     dx, 0f00h
        int     10h
        
        pop     bp
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
        
reset_pc:
        ; jmp   far ptr 0f000h:0fff0h
        db      0eah
        dw      0fff0h
        dw      0f000h
        ret
        
start_system:
        ; 读取硬盘的逻辑扇区2到0000h:7c00h
        xor     ax, ax
        mov     es, ax
        mov     bx, 7c00h
        mov     dx, 0080h
        mov     cx, 0003h
        mov     ax, 0201h
        int     13h
        
        mov     dl, 80h         ; 从硬盘启动
        
        ; jmp   far ptr 0000h:7c00h
        db      0eah
        dw      7c00h
        dw      0000h
        ret
        
clock:
        push    ax
        push    bx
        push    si
        
        mov     bx, offset color
        call    cls
        
clock_loop:
        call    read_time
        call    show_time
        mov     si, 19
        call    update_cursor
        call    kbhit
        cmp     ax, 0
        jz      clock_hlt
        call    getchar
        cmp     ah, 01h         ; Esc
        je      clock_exit
        cmp     ah, 3bh         ; F1
        jne     clock_hlt
        inc     byte ptr [bx]
clock_hlt:
        hlt
        jmp     clock_loop
        
clock_exit:
        mov     byte ptr [bx], 07h
        pop     si
        pop     bx
        pop     ax
        ret
        
set_clock:
        push    ax
        push    bx
        push    si
        
        call    cls
        call    read_time
        call    show_time
        mov     bx, offset time
        xor     si, si
        call    update_cursor
        
set_clock_loop:
        call    getchar
        cmp     ah, 01h         ; Esc
        je      set_clock_exit
        cmp     ah, 1ch         ; Enter
        jne     @f
        call    write_time
        jmp     set_clock_exit
@@:
        cmp     ah, 4bh         ; 左箭头
        jne     @f
        cmp     si, 0
        je      set_clock_hlt
        dec     si
        call    update_cursor
        jmp     set_clock_hlt
@@:
        cmp     ah, 4dh         ; 右箭头
        jne     @f
        cmp     si, 18
        je      set_clock_hlt
        inc     si
        call    update_cursor
        jmp     set_clock_hlt
@@:
        cmp     al, '0'
        jb      set_clock_hlt
        cmp     al, '9'
        ja      set_clock_hlt
        mov     byte ptr [bx + si], al
        call    show_time
set_clock_hlt:
        hlt
        jmp     set_clock_loop
        
set_clock_exit:
        pop     si
        pop     bx
        pop     ax
        ret
        
uninstall_this:
        xor     ax, ax
        mov     es, ax
        
        ; 读取硬盘的逻辑扇区2到0000h:7c00h
        mov     bx, 7c00h
        mov     dx, 0080h
        mov     cx, 0003h
        mov     ax, 0201h
        int     13h
        
        ; 把0000h:7c00h写到硬盘的逻辑扇区0
        mov     bx, 7c00h
        mov     dx, 0080h
        mov     cx, 0001h
        mov     ax, 0301h
        int     13h
        
        call    reset_pc
        ret
        
cls:
        push    ax
        push    cx
        push    di
        push    es
        mov     ax, 0b800h
        mov     es, ax
        mov     ax, 0720h
        xor     di, di
        mov     cx, 2000
        cld
        rep     stosw
        pop     es
        pop     di
        pop     cx
        pop     ax
        ret
        
getchar:
        mov     ah, 0
        int     16h
        ret
        
kbhit:
        mov     ah, 1
        int     16h
        jnz     @f
        xor     ax, ax
@@:
        ret
        
read_time:
        push    ax
        push    bx
        push    cx
        
        mov     bx, offset time
        mov     cx, 4
        
        ; 读取秒
        mov     al, 0
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 18], al
        mov     [bx + 17], ah
        
        ; 读取分
        mov     al, 2
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 15], al
        mov     [bx + 14], ah
        
        ; 读取时
        mov     al, 4
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 12], al
        mov     [bx + 11], ah
        
        ; 读取日
        mov     al, 7
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 9], al
        mov     [bx + 8], ah
        
        ; 读取月
        mov     al, 8
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 6], al
        mov     [bx + 5], ah
        
        ; 读取年
        mov     al, 9
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 3], al
        mov     [bx + 2], ah
        
        ; 读取世纪
        mov     al, 32h
        out     70h, al
        in      al, 71h
        mov     ah, al
        and     al, 0fh
        shr     ah, cl
        add     al, '0'
        add     ah, '0'
        mov     [bx + 1], al
        mov     [bx + 0], ah
        
        pop     cx
        pop     bx
        pop     ax
        ret
        
write_time:
        push    ax
        push    bx
        push    cx
        
        mov     bx, offset time
        mov     cx, 4
        
        ; 写入秒
        mov     al, 0
        out     70h, al
        mov     al, [bx + 18]
        mov     ah, [bx + 17]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        ; 写入分
        mov     al, 2
        out     70h, al
        mov     al, [bx + 15]
        mov     ah, [bx + 14]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        ; 写入时
        mov     al, 4
        out     70h, al
        mov     al, [bx + 12]
        mov     ah, [bx + 11]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        ; 写入日
        mov     al, 7
        out     70h, al
        mov     al, [bx + 9]
        mov     ah, [bx + 8]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        ; 写入月
        mov     al, 8
        out     70h, al
        mov     al, [bx + 6]
        mov     ah, [bx + 5]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        ; 写入年
        mov     al, 9
        out     70h, al
        mov     al, [bx + 3]
        mov     ah, [bx + 2]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        ; 写入世纪
        mov     al, 32h
        out     70h, al
        mov     al, [bx + 1]
        mov     ah, [bx + 0]
        sub     al, '0'
        sub     ah, '0'
        shl     ah, cl
        or      al, ah
        out     71h, al
        
        pop     cx
        pop     bx
        pop     ax
        ret
        
show_time:
        push    ax
        push    bx
        push    cx
        push    dx
        push    bp
        
        mov     bp, offset time
        mov     dx, 0c1fh
        mov     cx, 19
        mov     bx, offset color
        mov     bx, [bx]
        mov     ax, 1300h
        int     10h
        
        pop     bp
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
        
update_cursor:
        push    ax
        push    bx
        push    dx
        mov     ah, 02h
        mov     bh, 0
        mov     dx, 0c1fh
        add     dx, si
        int     10h
        pop     dx
        pop     bx
        pop     ax
        ret
        
menu:
        db '1) reset pc'
        db '2) start system'
        db '3) clock'
        db '4) set clock'
        db '5) uninstall this'
        
time    db '0000/00/00 00:00:00'
color   dw 0007h
        
; 这里存放被分区表和引导标志占用的内容
swap_data:
        db 66 dup(0)
mbr_end:
mbr ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-4 10:21:22 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-4 12:03:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 14:50:13 | 显示全部楼层
大大还会汇编啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 14:58:02 | 显示全部楼层
jzzc 发表于 2020-3-6 14:50
大大还会汇编啊

我主修C/C++,学过汇编语言,略懂python和java
C/C++排第一,汇编语言是第二,python略比java强
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 15:07:49 | 显示全部楼层
人造人 发表于 2020-3-6 14:58
我主修C/C++,学过汇编语言,略懂python和java
C/C++排第一,汇编语言是第二,python略比java强
^_^

哈哈哈,您是我奋斗的目标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 15:12:37 | 显示全部楼层
jzzc 发表于 2020-3-6 15:07
哈哈哈,您是我奋斗的目标

加油
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 22:24:16 | 显示全部楼层

一直在忙工作小男神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-14 10:41:21 | 显示全部楼层
几百行代码瞬间下来了,666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-24 16:49:06 | 显示全部楼层
我来学习的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 23:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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