mbr.s 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. ; 主引导程序
  2. ; ----------------------------------------------------------------
  3. SECTION MBR vstart=0x7c00
  4. mov ax, cs ; 0x00000000
  5. mov ds, ax
  6. mov es, ax
  7. mov ss, ax
  8. mov fs, ax
  9. mov sp, 0x7c00
  10. call CleanDisply
  11. call GetCursorPosition
  12. call DispStr
  13. jmp $
  14. ;清屏,利用 0x06 号功能,上巻全部行,则可清屏
  15. ; ----------------------------------------------------------------
  16. ; INT 0X10 功能号:0x06 功能描述:上巻窗口
  17. ; AL=上卷行数
  18. ; AL=0 整个窗口空白
  19. ; BH=卷入行属性
  20. ; CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标)
  21. ; CL=左上角列号
  22. ; DH=右下角行号 (DH、DL)=窗口的右下角位置(Y坐标,X坐标)
  23. ; DL=右下角列号
  24. ; ----------------------------------------------------------------
  25. CleanDisply:
  26. mov ah, 0x06 ; 功能号
  27. mov al, 0x00 ; 上巻的行数(如果为 0,表示全部)
  28. mov bx, 0x700
  29. mov cx, 0 ; 左上角:(0,0)
  30. mov dx, 0x184f ; 右下角: (80, 25)
  31. ; VGA 文本模式中,一行只能容纳 80 个字符,共 25 行.
  32. ;下标、从 0 开始,所以 Ox18=24, 0x4f=79
  33. int 0x10 ; 调用 INT 0x10 功能
  34. ret
  35. ;;;;;;;;;;;; 获取光标位置 ;;;;;;;;;;;;;
  36. ; .get_cursor_position, 在光标位置打印字符
  37. GetCursorPosition:
  38. mov ah, 0x3 ; 3 号功能是获取光标位置,需要
  39. mov bh, 0 ; 待获取光标的页号
  40. int 0x10
  41. ret
  42. ;;;;;;;;;;;; 获取光标位置结束 ;;;;;;;;;
  43. ; 13 号子功能打印字符串
  44. ;--------------------------------------------------------
  45. ;--------------------------------------------------------
  46. DispStr:
  47. mov ax, BootMessage
  48. mov bp, ax ; ss:bp 为串首地址
  49. mov cx, 16 ; 串长度,不包括结束符个数
  50. mov ax, 0x01301 ; 子功能号 13 显示字符及属性
  51. ; al 设置写字符方式 al=01: 显示字符串,光标跟随移动
  52. mov bx, 0x2 ; bh 显示的页号 bl 是字符属性,黑底绿字(bl=02h)
  53. mov dl, 0
  54. int 0x10
  55. ret
  56. BootMessage: db "Hello OS World"
  57. times 510 - ($-$$) db 0
  58. db 0x55, 0xaa