|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
code segment
start: mov ah,0
int 16h
mov ah,1 ;A
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp short sret
red: shl ah,1 ;B
green: shl ah,1 ;C
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
问题:这个程序使用了mov ah,0 Int 16h 指令,即从键盘缓冲区读取一个字单元的内容到AX中,但是在进入(windows10下载的虚拟dos)DOS模式时,通过输入命令(masm,link,debug)对该源程序进行编译链接时已经按下了键盘,在这种情况下我其实想知道通过前面的这些操作,键盘缓冲区会存放相应的ASCII码值和扫描码吗?这时再加载这个程序,前面已经按下了很多按键,按道理来说键盘缓冲区中应该存放了相应的ASCII码值和扫描码的值,键盘缓冲区不为空,为啥加载该程序后,这个程序会一直等待按键输入,当按下一个键后,程序才开始往下执行。求大佬解惑。
本帖最后由 jackz007 于 2022-10-10 18:32 编辑
DOS 属于独占式操作系统,键盘缓冲区是公用的,该别人用的已经被别人取走了,比如,你键入的 masm、link、debug 等都会尽数被 DOS 的 COMMAND.COM 及时取走,在 debug.exe 启动后的键盘活动会被 debug.exe 取走,在你的程序启动时,DOS 提交给你的是一个处于清空状态的键盘缓冲区,这时,执行 int 16h 需要有效的按键,才能取到相应的按键及其扫描码,所以,程序会有等待。
|
|