• in 9h:从60h端口读入键盘输入

image.png

  • int 16h:从键盘缓冲区读取数据,并将其从缓冲区删除(循环检测缓冲区中是否有数据)

    • 内存->数据缓冲区->ax
    • 结果:(ah)=扫描码,(al)=ASCII码
      1. mov ah,0 ;16h例程的0号功能
      2. int 16h
      image.png
  • 例题:输入r,屏幕显示字符设置为红色 ```cpp assume cs:code code segment start:mov ah,0

    1. int 16h
    2. mov ah,1 ;把高位扫描码覆盖为1
    3. cmp al,'r' ;对比ASCII
    4. je red
    5. cmp al,'g'
    6. je green
    7. cmp al,'b'
    8. je blue
    9. jmp short sret

red: shl ah,1 green:shl ah,1

blue:mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 s:and byte ptr es:[bx],11111000b ;最后三位控制红绿蓝 or es:[bx],ah add bx,2 loop s sret: mov ax,4c00h int 21h code ends end start

  1. <a name="nfFYe"></a>
  2. ### 字符串的输入
  3. - 功能:输入时显示,回车输入结束,能够删除输入的字符
  4. - (dh):字符串在屏幕上显示的行的位置
  5. - (dl):字符串在屏幕上显示的列的位置
  6. - ds:si:指向字符串存储空间,以0结尾
  7. - 按照栈的访问顺序(字符栈)【功能的封装】
  8. - (ah)=0入栈 1出栈 2显示
  9. - ds:si指向字符栈空间
  10. - (ah)=0时,(al)=入栈字符
  11. - (ah)=1时,(al)=返回字符
  12. - (ah)=3时,(dh):字符串在屏幕上显示的行的位置,(dl):字符串在屏幕上显示的列的位置
  13. ```cpp
  14. assume cs:code
  15. code segment
  16. start:
  17. call getstr
  18. return:
  19. mov ax,4c00h
  20. int 21h
  21. getstr:
  22. push ax
  23. getstrs:
  24. mov ah,0
  25. int 16h ;缓冲区->al
  26. cmp al,20h
  27. jb nochar
  28. mov ah,0 ;字符入栈
  29. call charstack
  30. mov ah,2 ;字符显示
  31. call charstack
  32. jmp getstrs ;循环获取缓冲区中的字符
  33. nochar:
  34. cmp ah,0eh ;退格键
  35. je backspace
  36. cmp ah,1ch ;回车键
  37. je enter
  38. jmp getstrs
  39. backspace:
  40. mov ah,1 ;删除,字符出栈
  41. call charstack
  42. mov ah,2 ;显示字符
  43. call charstack
  44. jmp getstrs
  45. enter:
  46. mov al,0
  47. mov ah,0
  48. call chastack ;0入栈,表示结尾
  49. mov ah,2
  50. call charstack
  51. pop ax
  52. ret
  53. chastack:
  54. jmp short charstart
  55. table dw charpush,charpop,charshow
  56. top dw 0 ;栈顶
  57. charstart:
  58. push bx
  59. push dx
  60. push di
  61. push es
  62. cmp ah,2
  63. ja sret
  64. mov bl,ah
  65. mov bh,0
  66. add bx,bx
  67. jmp word ptr table[bx]
  68. charpush:
  69. mov bx,top
  70. mov [si][bx],al ;输入数据默认存放在al寄存器
  71. inc top ;模拟栈
  72. jmp sret
  73. charpop:
  74. cmp top,0;判断栈是否为空
  75. je sret
  76. dec top
  77. mov bx,top
  78. mov al,[si][bx] ;弹出数据默认存放在al寄存器
  79. jmp sret
  80. charshow:
  81. mov bx,0b800h
  82. mov es,bx
  83. mov al,160 ;一行160个字节,用来定位总偏移
  84. mov ah,0
  85. mul dh ;160*行号
  86. mov di,ax
  87. add dl,dl ;列号*2
  88. mov dh,0
  89. add di,dx ;di为定位到0b800的总偏移
  90. mov bx,0
  91. charshows:
  92. cmp bx,top
  93. jne noempty
  94. mov byte ptr es:[di],'
  95. jmp sret
  96. noempty:
  97. mov al,[si][bx]
  98. mov es:[di],al ;放到显存
  99. mov byte ptr es:[di+2],' '
  100. inc bx
  101. add di,2
  102. jmp charshows
  103. sret:
  104. pop...

int 13h对磁盘进行读写

  • 古老的3.5英寸软盘
    • 上下两面
    • 每面80个磁道
    • 每个磁道18个扇区
    • 每个扇区大小为512B
    • 总大小:2x80x18x512B
  • 通过控制磁盘控制器来访问磁盘
    • 以扇区为单位进行读写(面号【从0开始】、磁道号【从0开始】、扇区号【从1开始】)
  • (ah)=int 13h的功能号
    • 2:读扇区
    • 3:写扇区
  • (al)=读取的扇区数
  • (ch)=磁道号
  • (cl)=扇区号
  • (dh)=磁头号(面号)
  • (dl)=驱动器号
    • 软驱从0开始
    • 硬盘从80h开始
  • es:bx指向接受磁扇区读入数据的内存区
  • 返回参数
    • 操作成功:(ah)=0,(al)=写入的扇区数
    • 失败:(ah)=出错代码