向往前方ing 发表于 2022-10-10 17:49:46

汇编语言王爽17章

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:,11111000b
      or es:,ah
      add bx,2
      loop s

sret:    mov ax,4c00h
          int 21h
code ends
end start
问题:这个程序使用了mov ah,0Int 16h 指令,即从键盘缓冲区读取一个字单元的内容到AX中,但是在进入(windows10下载的虚拟dos)DOS模式时,通过输入命令(masm,link,debug)对该源程序进行编译链接时已经按下了键盘,在这种情况下我其实想知道通过前面的这些操作,键盘缓冲区会存放相应的ASCII码值和扫描码吗?这时再加载这个程序,前面已经按下了很多按键,按道理来说键盘缓冲区中应该存放了相应的ASCII码值和扫描码的值,键盘缓冲区不为空,为啥加载该程序后,这个程序会一直等待按键输入,当按下一个键后,程序才开始往下执行。求大佬解惑。

jackz007 发表于 2022-10-10 18:03:37

本帖最后由 jackz007 于 2022-10-10 18:32 编辑

       DOS 属于独占式操作系统,键盘缓冲区是公用的,该别人用的已经被别人取走了,比如,你键入的 masm、link、debug 等都会尽数被 DOS 的 COMMAND.COM 及时取走,在 debug.exe 启动后的键盘活动会被 debug.exe 取走,在你的程序启动时,DOS 提交给你的是一个处于清空状态的键盘缓冲区,这时,执行 int 16h 需要有效的按键,才能取到相应的按键及其扫描码,所以,程序会有等待。

向往前方ing 发表于 2022-10-10 19:48:54

感谢解惑。刚学汇编不久,由于对操作系统这方面不是很了解,导致这个问题困扰了我一段时间在网上翻遍了都没有这方面的解答,加上书上和小甲鱼老师只是过了一遍程序没有运行,所以决定自己运行看看,在这过程中我就产生这方面的疑惑,不过看了你的解答后我明白了许多。顺便再问你一下现在Windows10还能调(diao)出实模式下的DOS吗?总之感谢大佬

jackz007 发表于 2022-10-10 19:52:53

本帖最后由 jackz007 于 2022-10-10 19:54 编辑

向往前方ing 发表于 2022-10-10 19:48
感谢解惑。刚学汇编不久,由于对操作系统这方面不是很了解,导致这个问题困扰了我一段时间在网上翻遍了都没 ...

         不能,只能用类似于 DOS 虚拟机的软件,比如,DOSBox 来模拟 DOS 环境。

向往前方ing 发表于 2022-10-10 20:05:58

嗯,了解。再问一个问题,嘿嘿。现在正在学王爽老师的汇编语言17章,这里有个例子就是将当前DOS屏幕上的内容保存在软盘的0面0道的1-8个区,按照他的这个代码写完后,再虚拟dos下运行后再通过debug调试后发现ah不等于0,而是ff(书上的意思这是错误代码),这是什么情况呢,是因为现在的电脑没有装软盘(A,B盘)了吗?
assume cs:code

code segment

start:    mov ax,0b800h
         mov es,ax
           mov bx,0
          
           mov al,8
           mov ch,0
           mov cl,1
           mov dl,0h
           mov dh,0
           mov ah,3
           int 13h
          
           mov ax,4c00h
           int 21h
          
code ends
end start

人造人 发表于 2022-10-10 21:28:52

向往前方ing 发表于 2022-10-10 20:05
嗯,了解。再问一个问题,嘿嘿。现在正在学王爽老师的汇编语言17章,这里有个例子就是将当前DOS屏幕上的内 ...

是的,先继续往后学吧,之后换一个虚拟机就可以用这样的代码了
例如,bochs,qemu
你可以给这些虚拟机添加软盘

人造人 发表于 2022-10-10 21:40:10

我试了试这个代码,没问题

人造人 发表于 2022-10-10 21:54:38




向往前方ing 发表于 2022-10-10 22:04:50

感谢解答.
页: [1]
查看完整版本: 汇编语言王爽17章