鱼C论坛

 找回密码
 立即注册
查看: 3087|回复: 2

谁知道 王爽的课程设计2 怎么解决

[复制链接]
发表于 2011-12-11 21:38:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 郑小夕 于 2012-7-16 18:55 编辑

怎么解决
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-12-11 21:38:58 | 显示全部楼层
对于 实模式 不是很了解。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-12 09:50:08 | 显示全部楼层
  1. assume cs:code

  2. code segment

  3. ;===============================================================

  4. ;功能:将代码写入0面0道1扇区

  5. ;入口参数:

  6. ;    (ah)=int 13h的功能号(2表示读扇区,3表示写扇区)

  7. ;    (al)=写入的扇区数

  8. ;    (ch)=磁道号

  9. ;    (cl)=扇区号

  10. ;    (dh)=磁头号(面号)

  11. ;    (dl)=驱动器号    软区从0开始,0:软驱A,1:软驱B

  12. ;                        硬盘从80h开始,80h:硬盘C,81h:硬盘D

  13. ;    es:bx指向将写入磁盘的数据或指向接收从扇区读入数据的内存区

  14. ;返回参数:

  15. ;    操作成功:(ah)=0,(al)=写入的扇区数

  16. ;    操作失败:(ah)=出错代码

  17. ;===============================================================

  18. start:

  19.      mov ax,floppyend-floppy

  20.      mov dx,0

  21.      mov bx,512

  22.      div bx        ;商ax为所需的扇区数

  23.      inc al        ;写入的扇区数(为余数加扇区)



  24.      push cs

  25.      pop es

  26.      mov bx,offset floppy   ;es:bx指向要被写入的内存单元



  27.      mov ch,0 ;磁道号

  28.      mov cl,1 ;扇区号

  29.      mov dl,0 ;驱动器号,软盘A

  30.      mov dh,0 ;磁头号(面号)

  31.      mov ah,3 ;int 13h的功能号(3表示写扇区)

  32.      int 13h       ;将代码写入0面0道1扇区



  33.      mov ax,4c00h

  34.      int 21h



  35. floppy:

  36.      jmp read

  37. ;===============================================================

  38. ;直接定址表

  39. ;===============================================================

  40. table    dw function1-floppy,function2-floppy

  41.      dw function3-floppy,function4-floppy



  42. menu db '***main Menu***',0

  43.      db '1) reset pc    ',0

  44.      db '2) start system',0

  45.      db '3) clock       ',0

  46.      db '4) set clock   ',0

  47.      db 'Please Choose: ',0



  48. time db 'YY/MM/DD hh:mm:ss',0

  49. cmos db 9,8,7,4,2,0

  50. hint db 'press F1 to change the color, press Esc to return',0



  51. hint1    db 'Please input: YY/MM/DD hh:mm:ss',0

  52. char db '  /  /     :  :  ',0



  53. ;===============================================================

  54. ;功能:将0面0道2扇区的内容写入0:7e00h

  55. ;入口参数:

  56. ;    (ah)=int 13h的功能号(2表示读扇区)

  57. ;    (al)=写入的扇区数

  58. ;    (ch)=磁道号

  59. ;    (cl)=扇区号

  60. ;    (dh)=磁头号(面号)

  61. ;    (dl)=驱动器号    软区从0开始,0:软驱A,1:软区B

  62. ;                        硬盘从80h开始,80h:硬盘C,81h:硬盘D

  63. ;    es:bx指向将写入磁盘的数据

  64. ;返回参数:

  65. ;    操作成功:(ah)=0,(al)=写入的扇区数

  66. ;    操作失败:(ah)=出错代码

  67. ;===============================================================

  68. read:

  69.      mov ax,floppyend-floppy

  70.      mov dx,0

  71.      mov bx,512

  72.      div bx        ;商ax为所需的扇区数

  73.      inc al



  74.      mov bx,0

  75.      mov es,bx

  76.      mov bx,7e00h  ;es:bx指向要读入的内存单元



  77.      mov ch,0 ;磁道号

  78.      mov cl,2 ;扇区号

  79.      mov dl,0 ;驱动器号

  80.      mov dh,0 ;磁头号(面号)

  81.      mov ah,2 ;int 13h的功能号(2表示读扇区)

  82.      int 13h       ;读取0面0道2扇区的内容到0:7e00h处

  83.               ;(第二扇区从512/200h开始)



  84.      mov ax,7c0h

  85.      push ax       ;push cs

  86.      mov ax,showmenu-floppy

  87.      push ax       ;push ip

  88.      retf     ;jmp showmenu



  89. ;***************************************************************

  90. ;显示主菜单,调用show_str、clean子程序

  91. ;***************************************************************

  92. showmenu:

  93.      call clean    ;清屏

  94.      push cs

  95.      pop ds

  96.      mov si,menu-floppy

  97.      mov dh,8

  98.      mov dl,30

  99.      mov cx,6

  100. showmenu0:

  101.      push cx

  102.      mov cl,2

  103.      call show_str

  104.      add si,16

  105.      inc dh

  106.      pop cx

  107.      loop showmenu0



  108. ;===============================================================

  109. ;接收键盘输入,跳转相应功能程序段

  110. ;调用BIOS用来提供读取键盘缓冲区功能的中断例程int 16h,

  111. ;将读取的扫描码送入ah,ASCII码送入al

  112. ;===============================================================

  113. go:  mov ax,0

  114.      int 16h

  115.      cmp al,'1'

  116.      jb showmenu

  117.      cmp al,'4'

  118.      ja showmenu



  119.      sub al,31h

  120.      mov bl,al

  121.      mov bh,0

  122.      add bx,bx

  123.      add bx,3 ;计算相应子程序在table中的位移

  124.      call word ptr cs:[bx]



  125.      jmp showmenu



  126. ;***************************************************************

  127. ;功能1:重新启动计算机

  128. ;***************************************************************

  129. function1:

  130.      mov ax,0ffffh

  131.      push ax

  132.      mov ax,0

  133.      push ax

  134.      retf     ;jmp ffff:0



  135. ;***************************************************************

  136. ;功能3:进入时钟程序

  137. ;***************************************************************

  138. function3:

  139.      push ax

  140.      push bx

  141.      push cx

  142.      push dx

  143.      push si

  144.      push ds

  145.      push es

  146.      call clean    ;清屏

  147.      mov dh,0 ;行号

  148.      mov dl,0 ;列号

  149.      mov cl,2

  150.      mov si,offset hint-floppy

  151.      call show_str ;显示提示信息

  152. ;===============================================================

  153. ;名称:clock

  154. ;功能:动态显示当前日期、时间

  155. ;===============================================================

  156.      mov cx,2 ;显示颜色

  157. clock:   mov bx,offset cmos-floppy

  158.      mov si,offset time-floppy

  159.      push cx

  160.      mov cx,6

  161. clock0:  push cx

  162.      mov al,[bx]

  163.      out 70h,al    ;将al送入地址端口70h

  164.      in al,71h ;从数据端口71h处读出单元内容

  165.      mov ah,al

  166.      mov cl,4

  167.      shr al,cl ;右移4位

  168.      and ah,0fh    ;al分成两个表示BCD码值的数据

  169.      add ax,3030h  ;BCD码+30h=10进制数对应的ASCII码

  170.      mov [si],ax   ;ASCII码写入time段

  171.      inc bx

  172.      add si,3

  173.      pop cx

  174.      loop clock0

  175. ;---------------------------------------------------------------

  176. ;按下F1键后,改变显示颜色

  177. ;按下Esc键后,返回主菜单,其他键照常处理

  178. ;---------------------------------------------------------------

  179.      mov al,0

  180.      in al,60h

  181.      pop cx        ;显示颜色

  182.      cmp al,3bh    ;和F1的扫描码3bh比较

  183.      je colour

  184.      cmp al,1 ;和esc的扫描码01h比较

  185.      je clockend

  186.      jmp show_clock

  187. col_1:   mov cx,1 ;cl∈[1,7],0为黑色

  188.      jmp show_clock

  189. colour:  cmp cx,7

  190.      je col_1

  191.      inc cx

  192. show_clock:

  193.      mov dh,12 ;行号

  194.      mov dl,30 ;列号

  195.      mov si,offset time-floppy

  196.      call show_str

  197.      jmp clock ;循环显示CMOS

  198. clockend:

  199.      pop es

  200.      pop ds

  201.      pop si

  202.      pop dx

  203.      pop cx

  204.      pop bx

  205.      pop ax

  206.      ret



  207. ;***************************************************************

  208. ;功能4:设置时间

  209. ;***************************************************************

  210. function4:

  211.      push ax

  212.      push bx

  213.      push cx

  214.      push dx

  215.      push si

  216.      call clean



  217.      mov dh,8 ;行号

  218.      mov dl,30 ;列号

  219.      mov cl,2

  220.      mov si,offset hint1-floppy

  221.      call show_str ;显示提示信息



  222.      add dh,1 ;行号

  223.      add dl,14 ;列号

  224.      mov si,offset char-floppy   ;ds:si指向字符栈空间

  225.      call show_str ;显示输入格式

  226.      mov di,0

  227.      call getstrs

  228.      call witein

  229.      call cleanchar

  230.      pop si

  231.      pop dx

  232.      pop cx

  233.      pop bx

  234.      pop ax

  235.      ret



  236. ;===============================================================

  237. ;清除char内输入数据,还原环境

  238. ;===============================================================

  239. cleanchar:

  240.      push cx

  241. cleanchar1:

  242.      mov cx,di

  243.      jcxz cleanchar2

  244.      call charpop

  245.      jmp cleanchar1

  246. cleanchar2:

  247.      pop cx

  248.      ret



  249. ;===============================================================

  250. ;ASCII=>BCD,写入CMOS

  251. ;===============================================================

  252. witein:

  253.      push si

  254.      mov cx,6

  255.      mov bx,offset cmos-floppy

  256. wite:    push cx

  257.      mov al,[bx]

  258.      out 70h,al    ;将al送入地址端口70h

  259.      mov ax,[si]

  260.      sub ah,30h    ;10进制数对应的ASCII码-30h=BCD码

  261.      sub al,30h

  262.      mov cl,4

  263.      shl al,cl ;左移4位

  264.      add al,ah ;al为8位BCD码

  265.      out 71h,al    ;从数据端口71h处写入单元内容

  266.      add si,3

  267.      inc bx

  268.      pop cx

  269.      loop wite

  270.      pop si

  271.      ret

  272. ;===============================================================

  273. ;子程序:接收数字输入

  274. ;参数说明:di=char栈顶(字符地址、个数记录器)

  275. ;===============================================================

  276. getstrs:

  277.      push ax

  278.      push bx

  279. getstr:  mov ax,0

  280.      int 16h

  281.      cmp ah,0eh         ;退格键的扫描码

  282.      je backspace

  283.      cmp ah,1ch         ;Enter键的扫描码

  284.      je enter1

  285.      cmp al,'0'

  286.      jb getstr

  287.      cmp al,'9'

  288.      ja getstr

  289.      cmp di,16     ;限制输入个数

  290.      ja enter1

  291.      call charpush      ;字符入栈

  292.      call show_str      ;显示栈中字符

  293.      jmp getstr

  294. backspace:

  295.      call charpop       ;字符出栈

  296.      call show_str      ;显示栈中字符

  297.      jmp getstr

  298. enter1:  call show_str      ;显示栈中字符

  299.      pop bx

  300.      pop ax

  301.      ret

  302.      

  303. ;===============================================================

  304. ;子程序:数字的入栈。

  305. ;参数说明:ds:si指向char栈空间;(al)=入栈字符;

  306. ;===============================================================

  307. charpush:

  308.      mov bx,di

  309.      mov [si][bx],al

  310.      inc di

  311.      cmp di,2

  312.      je adds

  313.      cmp di,5

  314.      je adds

  315.      cmp di,8

  316.      je adds

  317.      cmp di,11

  318.      je adds

  319.      cmp di,14

  320.      je adds

  321.      ret

  322. adds:    inc di

  323.      ret



  324. ;===============================================================

  325. ;子程序:数字的出栈。

  326. ;参数说明:ds:si指向char栈空间;(al)=入栈字符;

  327. ;===============================================================

  328. charpop:cmp di,0

  329.      je sret            ;栈顶为0(无字符),结束

  330.      cmp di,3

  331.      je subs

  332.      cmp di,6

  333.      je subs

  334.      cmp di,9

  335.      je subs

  336.      cmp di,12

  337.      je subs

  338.      cmp di,15

  339.      je subs

  340.      dec di

  341.      mov bx,di

  342.      mov al,' '

  343.      mov [si][bx],al

  344.      ret  

  345. subs:    sub di,2

  346.      mov bx,di

  347.      mov al,' '

  348.      mov [si][bx],al

  349.      ret

  350. sret:    ret



  351. ;===============================================================

  352. ;名称:show_str子程序

  353. ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。

  354. ;参数:(dh)=行号(取值范围0~24);

  355. ;      (dl)=列号(取值范围0~79);

  356. ;      (cl)=颜色;

  357. ;      ds:si指向字符串的首地址。

  358. ;返回:无。

  359. ;===============================================================

  360. show_str:

  361.      push ax

  362.      push bx

  363.      push cx

  364.      push dx

  365.      push si

  366.      push es

  367.      mov ax,0b800h

  368.      mov es,ax

  369.      mov ax,160

  370.      mul dh

  371.      mov bx,ax ;bx=160*dh

  372.      mov ax,2

  373.      mul dl        ;ax=dl*2

  374.      add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址

  375.      mov al,cl ;把颜色cl赋值al

  376.      mov cl,0

  377. show0:   mov ch,[si]

  378.      jcxz show1    ;(ds:si)=0时,转到show1执行   

  379.      mov es:[bx],ch

  380.      mov es:[bx].1,al

  381.      inc si        ;ds:si指向下一个字符地址

  382.      add bx,2 ;es:bx指向下一个显存地址

  383.      jmp show0

  384. show1:   pop es

  385.      pop si

  386.      pop dx

  387.      pop cx

  388.      pop bx

  389.      pop ax

  390.      ret



  391. ;===============================================================

  392. ;名称:clean子程序

  393. ;功能:清屏

  394. ;===============================================================

  395. clean:   push bx

  396.      push cx

  397.      push es

  398.      mov bx,0b800h

  399.      mov es,bx

  400.      mov bx,0

  401.      mov cx,2000

  402. clean0:  mov byte ptr es:[bx],' '

  403.      add bx,2

  404.      loop clean0

  405.      pop bx

  406.      pop cx

  407.      pop es

  408.      ret



  409. ;***************************************************************

  410. ;功能2:引导现有的操作系统

  411. ;***************************************************************

  412. ;===============================================================

  413. ;功能2实现引导现有的操作系统,代码需要将硬盘的0面0道1扇区读入0:7c00,

  414. ;会覆盖从软盘读到0:7c00的第一个扇区,所以功能2代码不能写在第一个扇区

  415. ;===============================================================

  416. function2:

  417.      call clean

  418.      mov ax,0

  419.      mov es,ax

  420.      mov bx,7c00h



  421.      mov al,1 ;读取的扇区数

  422.      mov ch,0 ;磁道号

  423.      mov cl,1 ;扇区号

  424.      mov dl,80h    ;驱动器号

  425.      mov dh,0 ;磁头号(面号)

  426.      mov ah,2 ;int 13h的功能号(2表示读扇区)

  427.      int 13h       ;读取0面0道1扇区的内容到0:7c00h处



  428.      mov ax,0

  429.      push ax       ;push cs

  430.      mov ax,7c00h

  431.      push ax       ;push ip

  432.      retf     ;jmp 0:7c00h



  433. floppyend:nop



  434. code ends

  435. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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