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

int 16h:从键盘缓冲区读取数据,并将其从缓冲区删除(循环检测缓冲区中是否有数据)
- 内存->数据缓冲区->ax
- 结果:(ah)=扫描码,(al)=ASCII码
mov ah,0 ;16h例程的0号功能int 16h

例题:输入r,屏幕显示字符设置为红色 ```cpp assume cs:code code segment start:mov ah,0
int 16hmov ah,1 ;把高位扫描码覆盖为1cmp al,'r' ;对比ASCII码je redcmp al,'g'je greencmp al,'b'je bluejmp 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
<a name="nfFYe"></a>### 字符串的输入- 功能:输入时显示,回车输入结束,能够删除输入的字符- (dh):字符串在屏幕上显示的行的位置- (dl):字符串在屏幕上显示的列的位置- ds:si:指向字符串存储空间,以0结尾- 按照栈的访问顺序(字符栈)【功能的封装】- (ah)=0入栈 1出栈 2显示- ds:si指向字符栈空间- (ah)=0时,(al)=入栈字符- (ah)=1时,(al)=返回字符- (ah)=3时,(dh):字符串在屏幕上显示的行的位置,(dl):字符串在屏幕上显示的列的位置```cppassume cs:codecode segmentstart:call getstrreturn:mov ax,4c00hint 21hgetstr:push axgetstrs:mov ah,0int 16h ;缓冲区->alcmp al,20hjb nocharmov ah,0 ;字符入栈call charstackmov ah,2 ;字符显示call charstackjmp getstrs ;循环获取缓冲区中的字符nochar:cmp ah,0eh ;退格键je backspacecmp ah,1ch ;回车键je enterjmp getstrsbackspace:mov ah,1 ;删除,字符出栈call charstackmov ah,2 ;显示字符call charstackjmp getstrsenter:mov al,0mov ah,0call chastack ;0入栈,表示结尾mov ah,2call charstackpop axretchastack:jmp short charstarttable dw charpush,charpop,charshowtop dw 0 ;栈顶charstart:push bxpush dxpush dipush escmp ah,2ja sretmov bl,ahmov bh,0add bx,bxjmp word ptr table[bx]charpush:mov bx,topmov [si][bx],al ;输入数据默认存放在al寄存器inc top ;模拟栈jmp sretcharpop:cmp top,0;判断栈是否为空je sretdec topmov bx,topmov al,[si][bx] ;弹出数据默认存放在al寄存器jmp sretcharshow:mov bx,0b800hmov es,bxmov al,160 ;一行160个字节,用来定位总偏移mov ah,0mul dh ;160*行号mov di,axadd dl,dl ;列号*2mov dh,0add di,dx ;di为定位到0b800的总偏移mov bx,0charshows:cmp bx,topjne noemptymov byte ptr es:[di],'jmp sretnoempty:mov al,[si][bx]mov es:[di],al ;放到显存mov byte ptr es:[di+2],' 'inc bxadd di,2jmp charshowssret: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)=出错代码
