鱼C论坛

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

[汇编作业] 课程设计2

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

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

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

x
  1. assume cs:code, ds:data

  2. stack segment
  3.         db 64 dup(0)
  4. stack ends

  5. data segment
  6. buf     db 1024 dup(0)
  7. old_mbr db 512 dup(0)
  8. data ends

  9. code segment
  10. start:
  11.         mov     ax, data
  12.         mov     ds, ax
  13.         mov     es, ax
  14.         mov     ax, stack
  15.         mov     ss, ax
  16.         mov     sp, 64
  17.         
  18.         ; 读取硬盘的逻辑扇区0到old_mbr
  19.         mov     bx, offset old_mbr
  20.         mov     dx, 0080h
  21.         mov     cx, 0001h
  22.         mov     ax, 0201h
  23.         int     13h
  24.         
  25.         ; 把old_mbr写到硬盘的逻辑扇区2
  26.         mov     bx, offset old_mbr
  27.         mov     dx, 0080h
  28.         mov     cx, 0003h
  29.         mov     ax, 0301h
  30.         int     13h
  31.         
  32.         ; 复制mbr段到buf
  33.         push    ds
  34.         mov     ax, mbr
  35.         mov     ds, ax
  36.         mov     si, offset mbr_start
  37.         mov     di, offset buf
  38.         mov     cx, mbr_end - mbr_start
  39.         cld
  40.         rep     movsb
  41.         pop     ds
  42.         
  43.         ; 备份被分区表和引导标志占用的内容
  44.         mov     si, offset buf
  45.         mov     di, offset buf
  46.         add     si, 1beh
  47.         add     di, offset swap_data
  48.         mov     cx, 66
  49.         cld
  50.         rep     movsb
  51.         
  52.         ; 复制分区表和引导标志
  53.         mov     si, offset old_mbr
  54.         mov     di, offset buf
  55.         add     si, 1beh
  56.         add     di, 1beh
  57.         mov     cx, 66
  58.         cld
  59.         rep     movsb
  60.         
  61.         ; 把buf写到硬盘的逻辑扇区0和逻辑扇区1
  62.         mov     bx, offset buf
  63.         mov     dx, 0080h
  64.         mov     cx, 0001h
  65.         mov     ax, 0302h
  66.         int     13h
  67.         
  68.         ; jmp   far ptr 0f000h:0fff0h
  69.         db      0eah
  70.         dw      0fff0h
  71.         dw      0f000h
  72.         
  73.         mov     ax, 4c00h
  74.         int     21h
  75. code ends

  76. mbr segment
  77. mbr_start:
  78.         mov     ax, cs
  79.         mov     ds, ax
  80.         mov     es, ax
  81.         mov     ss, ax
  82.         mov     sp, 7c00h
  83.         
  84.         mov     si, 7c00h
  85.         mov     di, 0600h
  86.         mov     cx, 256
  87.         cld
  88.         rep     movsw
  89.         
  90.         ; jmp   far ptr 60h:migrate
  91.         db      0eah
  92.         dw      migrate
  93.         dw      60h
  94. migrate:
  95.         mov     ax, cs
  96.         mov     ds, ax
  97.         mov     es, ax
  98.         
  99.         sti             ; 确保允许中断
  100.         
  101.         ; 读取硬盘的逻辑扇区1到当前代码后面
  102.         mov     bx, 200h
  103.         mov     dx, 0080h
  104.         mov     cx, 0002h
  105.         mov     ax, 0201h
  106.         int     13h
  107.         
  108.         ; 恢复被分区表和引导标志占用的内容
  109.         mov     si, offset swap_data
  110.         mov     di, 1beh
  111.         mov     cx, 66
  112.         cld
  113.         rep     movsb
  114.         
  115. main_loop:
  116.         call    cls
  117.         call    disp_menu
  118.         call    getchar
  119.         cmp     al, '1'
  120.         jne     @f
  121.         call    reset_pc
  122.         jmp     end_switch
  123. @@:
  124.         cmp     al, '2'
  125.         jne     @f
  126.         call    start_system
  127.         jmp     end_switch
  128. @@:
  129.         cmp     al, '3'
  130.         jne     @f
  131.         call    clock
  132.         jmp     end_switch
  133. @@:
  134.         cmp     al, '4'
  135.         jne     @f
  136.         call    set_clock
  137.         jmp     end_switch
  138. @@:
  139.         cmp     al, '5'
  140.         jne     @f
  141.         call    uninstall_this
  142.         jmp     end_switch
  143. @@:
  144. end_switch:
  145.         jmp     main_loop
  146.         
  147. disp_menu:
  148.         push    ax
  149.         push    bx
  150.         push    cx
  151.         push    dx
  152.         push    bp
  153.         
  154.         mov     bp, menu
  155.         mov     dx, 0a20h
  156.         mov     cx, 11
  157.         mov     bx, 0007h
  158.         mov     ax, 1300h
  159.         int     10h
  160.         
  161.         mov     bp, menu + 11
  162.         mov     dx, 0b20h
  163.         mov     cx, 15
  164.         mov     bx, 0007h
  165.         mov     ax, 1300h
  166.         int     10h
  167.         
  168.         mov     bp, menu + 26
  169.         mov     dx, 0c20h
  170.         mov     cx, 8
  171.         mov     bx, 0007h
  172.         mov     ax, 1300h
  173.         int     10h
  174.         
  175.         mov     bp, menu + 34
  176.         mov     dx, 0d20h
  177.         mov     cx, 12
  178.         mov     bx, 0007h
  179.         mov     ax, 1300h
  180.         int     10h
  181.         
  182.         mov     bp, menu + 46
  183.         mov     dx, 0e20h
  184.         mov     cx, 17
  185.         mov     bx, 0007h
  186.         mov     ax, 1300h
  187.         int     10h
  188.         
  189.         ; 设置光标到下一行
  190.         mov     ah, 02h
  191.         mov     bh, 0
  192.         mov     dx, 0f00h
  193.         int     10h
  194.         
  195.         pop     bp
  196.         pop     dx
  197.         pop     cx
  198.         pop     bx
  199.         pop     ax
  200.         ret
  201.         
  202. reset_pc:
  203.         ; jmp   far ptr 0f000h:0fff0h
  204.         db      0eah
  205.         dw      0fff0h
  206.         dw      0f000h
  207.         ret
  208.         
  209. start_system:
  210.         ; 读取硬盘的逻辑扇区2到0000h:7c00h
  211.         xor     ax, ax
  212.         mov     es, ax
  213.         mov     bx, 7c00h
  214.         mov     dx, 0080h
  215.         mov     cx, 0003h
  216.         mov     ax, 0201h
  217.         int     13h
  218.         
  219.         mov     dl, 80h         ; 从硬盘启动
  220.         
  221.         ; jmp   far ptr 0000h:7c00h
  222.         db      0eah
  223.         dw      7c00h
  224.         dw      0000h
  225.         ret
  226.         
  227. clock:
  228.         push    ax
  229.         push    bx
  230.         push    si
  231.         
  232.         mov     bx, offset color
  233.         call    cls
  234.         
  235. clock_loop:
  236.         call    read_time
  237.         call    show_time
  238.         mov     si, 19
  239.         call    update_cursor
  240.         call    kbhit
  241.         cmp     ax, 0
  242.         jz      clock_hlt
  243.         call    getchar
  244.         cmp     ah, 01h         ; Esc
  245.         je      clock_exit
  246.         cmp     ah, 3bh         ; F1
  247.         jne     clock_hlt
  248.         inc     byte ptr [bx]
  249. clock_hlt:
  250.         hlt
  251.         jmp     clock_loop
  252.         
  253. clock_exit:
  254.         mov     byte ptr [bx], 07h
  255.         pop     si
  256.         pop     bx
  257.         pop     ax
  258.         ret
  259.         
  260. set_clock:
  261.         push    ax
  262.         push    bx
  263.         push    si
  264.         
  265.         call    cls
  266.         call    read_time
  267.         call    show_time
  268.         mov     bx, offset time
  269.         xor     si, si
  270.         call    update_cursor
  271.         
  272. set_clock_loop:
  273.         call    getchar
  274.         cmp     ah, 01h         ; Esc
  275.         je      set_clock_exit
  276.         cmp     ah, 1ch         ; Enter
  277.         jne     @f
  278.         call    write_time
  279.         jmp     set_clock_exit
  280. @@:
  281.         cmp     ah, 4bh         ; 左箭头
  282.         jne     @f
  283.         cmp     si, 0
  284.         je      set_clock_hlt
  285.         dec     si
  286.         call    update_cursor
  287.         jmp     set_clock_hlt
  288. @@:
  289.         cmp     ah, 4dh         ; 右箭头
  290.         jne     @f
  291.         cmp     si, 18
  292.         je      set_clock_hlt
  293.         inc     si
  294.         call    update_cursor
  295.         jmp     set_clock_hlt
  296. @@:
  297.         cmp     al, '0'
  298.         jb      set_clock_hlt
  299.         cmp     al, '9'
  300.         ja      set_clock_hlt
  301.         mov     byte ptr [bx + si], al
  302.         call    show_time
  303. set_clock_hlt:
  304.         hlt
  305.         jmp     set_clock_loop
  306.         
  307. set_clock_exit:
  308.         pop     si
  309.         pop     bx
  310.         pop     ax
  311.         ret
  312.         
  313. uninstall_this:
  314.         xor     ax, ax
  315.         mov     es, ax
  316.         
  317.         ; 读取硬盘的逻辑扇区2到0000h:7c00h
  318.         mov     bx, 7c00h
  319.         mov     dx, 0080h
  320.         mov     cx, 0003h
  321.         mov     ax, 0201h
  322.         int     13h
  323.         
  324.         ; 把0000h:7c00h写到硬盘的逻辑扇区0
  325.         mov     bx, 7c00h
  326.         mov     dx, 0080h
  327.         mov     cx, 0001h
  328.         mov     ax, 0301h
  329.         int     13h
  330.         
  331.         call    reset_pc
  332.         ret
  333.         
  334. cls:
  335.         push    ax
  336.         push    cx
  337.         push    di
  338.         push    es
  339.         mov     ax, 0b800h
  340.         mov     es, ax
  341.         mov     ax, 0720h
  342.         xor     di, di
  343.         mov     cx, 2000
  344.         cld
  345.         rep     stosw
  346.         pop     es
  347.         pop     di
  348.         pop     cx
  349.         pop     ax
  350.         ret
  351.         
  352. getchar:
  353.         mov     ah, 0
  354.         int     16h
  355.         ret
  356.         
  357. kbhit:
  358.         mov     ah, 1
  359.         int     16h
  360.         jnz     @f
  361.         xor     ax, ax
  362. @@:
  363.         ret
  364.         
  365. read_time:
  366.         push    ax
  367.         push    bx
  368.         push    cx
  369.         
  370.         mov     bx, offset time
  371.         mov     cx, 4
  372.         
  373.         ; 读取秒
  374.         mov     al, 0
  375.         out     70h, al
  376.         in      al, 71h
  377.         mov     ah, al
  378.         and     al, 0fh
  379.         shr     ah, cl
  380.         add     al, '0'
  381.         add     ah, '0'
  382.         mov     [bx + 18], al
  383.         mov     [bx + 17], ah
  384.         
  385.         ; 读取分
  386.         mov     al, 2
  387.         out     70h, al
  388.         in      al, 71h
  389.         mov     ah, al
  390.         and     al, 0fh
  391.         shr     ah, cl
  392.         add     al, '0'
  393.         add     ah, '0'
  394.         mov     [bx + 15], al
  395.         mov     [bx + 14], ah
  396.         
  397.         ; 读取时
  398.         mov     al, 4
  399.         out     70h, al
  400.         in      al, 71h
  401.         mov     ah, al
  402.         and     al, 0fh
  403.         shr     ah, cl
  404.         add     al, '0'
  405.         add     ah, '0'
  406.         mov     [bx + 12], al
  407.         mov     [bx + 11], ah
  408.         
  409.         ; 读取日
  410.         mov     al, 7
  411.         out     70h, al
  412.         in      al, 71h
  413.         mov     ah, al
  414.         and     al, 0fh
  415.         shr     ah, cl
  416.         add     al, '0'
  417.         add     ah, '0'
  418.         mov     [bx + 9], al
  419.         mov     [bx + 8], ah
  420.         
  421.         ; 读取月
  422.         mov     al, 8
  423.         out     70h, al
  424.         in      al, 71h
  425.         mov     ah, al
  426.         and     al, 0fh
  427.         shr     ah, cl
  428.         add     al, '0'
  429.         add     ah, '0'
  430.         mov     [bx + 6], al
  431.         mov     [bx + 5], ah
  432.         
  433.         ; 读取年
  434.         mov     al, 9
  435.         out     70h, al
  436.         in      al, 71h
  437.         mov     ah, al
  438.         and     al, 0fh
  439.         shr     ah, cl
  440.         add     al, '0'
  441.         add     ah, '0'
  442.         mov     [bx + 3], al
  443.         mov     [bx + 2], ah
  444.         
  445.         ; 读取世纪
  446.         mov     al, 32h
  447.         out     70h, al
  448.         in      al, 71h
  449.         mov     ah, al
  450.         and     al, 0fh
  451.         shr     ah, cl
  452.         add     al, '0'
  453.         add     ah, '0'
  454.         mov     [bx + 1], al
  455.         mov     [bx + 0], ah
  456.         
  457.         pop     cx
  458.         pop     bx
  459.         pop     ax
  460.         ret
  461.         
  462. write_time:
  463.         push    ax
  464.         push    bx
  465.         push    cx
  466.         
  467.         mov     bx, offset time
  468.         mov     cx, 4
  469.         
  470.         ; 写入秒
  471.         mov     al, 0
  472.         out     70h, al
  473.         mov     al, [bx + 18]
  474.         mov     ah, [bx + 17]
  475.         sub     al, '0'
  476.         sub     ah, '0'
  477.         shl     ah, cl
  478.         or      al, ah
  479.         out     71h, al
  480.         
  481.         ; 写入分
  482.         mov     al, 2
  483.         out     70h, al
  484.         mov     al, [bx + 15]
  485.         mov     ah, [bx + 14]
  486.         sub     al, '0'
  487.         sub     ah, '0'
  488.         shl     ah, cl
  489.         or      al, ah
  490.         out     71h, al
  491.         
  492.         ; 写入时
  493.         mov     al, 4
  494.         out     70h, al
  495.         mov     al, [bx + 12]
  496.         mov     ah, [bx + 11]
  497.         sub     al, '0'
  498.         sub     ah, '0'
  499.         shl     ah, cl
  500.         or      al, ah
  501.         out     71h, al
  502.         
  503.         ; 写入日
  504.         mov     al, 7
  505.         out     70h, al
  506.         mov     al, [bx + 9]
  507.         mov     ah, [bx + 8]
  508.         sub     al, '0'
  509.         sub     ah, '0'
  510.         shl     ah, cl
  511.         or      al, ah
  512.         out     71h, al
  513.         
  514.         ; 写入月
  515.         mov     al, 8
  516.         out     70h, al
  517.         mov     al, [bx + 6]
  518.         mov     ah, [bx + 5]
  519.         sub     al, '0'
  520.         sub     ah, '0'
  521.         shl     ah, cl
  522.         or      al, ah
  523.         out     71h, al
  524.         
  525.         ; 写入年
  526.         mov     al, 9
  527.         out     70h, al
  528.         mov     al, [bx + 3]
  529.         mov     ah, [bx + 2]
  530.         sub     al, '0'
  531.         sub     ah, '0'
  532.         shl     ah, cl
  533.         or      al, ah
  534.         out     71h, al
  535.         
  536.         ; 写入世纪
  537.         mov     al, 32h
  538.         out     70h, al
  539.         mov     al, [bx + 1]
  540.         mov     ah, [bx + 0]
  541.         sub     al, '0'
  542.         sub     ah, '0'
  543.         shl     ah, cl
  544.         or      al, ah
  545.         out     71h, al
  546.         
  547.         pop     cx
  548.         pop     bx
  549.         pop     ax
  550.         ret
  551.         
  552. show_time:
  553.         push    ax
  554.         push    bx
  555.         push    cx
  556.         push    dx
  557.         push    bp
  558.         
  559.         mov     bp, offset time
  560.         mov     dx, 0c1fh
  561.         mov     cx, 19
  562.         mov     bx, offset color
  563.         mov     bx, [bx]
  564.         mov     ax, 1300h
  565.         int     10h
  566.         
  567.         pop     bp
  568.         pop     dx
  569.         pop     cx
  570.         pop     bx
  571.         pop     ax
  572.         ret
  573.         
  574. update_cursor:
  575.         push    ax
  576.         push    bx
  577.         push    dx
  578.         mov     ah, 02h
  579.         mov     bh, 0
  580.         mov     dx, 0c1fh
  581.         add     dx, si
  582.         int     10h
  583.         pop     dx
  584.         pop     bx
  585.         pop     ax
  586.         ret
  587.         
  588. menu:
  589.         db '1) reset pc'
  590.         db '2) start system'
  591.         db '3) clock'
  592.         db '4) set clock'
  593.         db '5) uninstall this'
  594.         
  595. time    db '0000/00/00 00:00:00'
  596. color   dw 0007h
  597.         
  598. ; 这里存放被分区表和引导标志占用的内容
  599. swap_data:
  600.         db 66 dup(0)
  601. mbr_end:
  602. mbr ends
  603. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-4 10:21:22 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-4 12:03:04 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 14:50:13 | 显示全部楼层
大大还会汇编啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我主修C/C++,学过汇编语言,略懂python和java
C/C++排第一,汇编语言是第二,python略比java强
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈哈,您是我奋斗的目标
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

加油
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

一直在忙工作小男神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-14 10:41:21 | 显示全部楼层
几百行代码瞬间下来了,666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-24 16:49:06 | 显示全部楼层
我来学习的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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