鱼C论坛

 找回密码
 立即注册
查看: 1703|回复: 8

[已解决]汇编语言王爽17章

[复制链接]
发表于 2022-10-10 17:49:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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码值和扫描码的值,键盘缓冲区不为空,为啥加载该程序后,这个程序会一直等待按键输入,当按下一个键后,程序才开始往下执行。求大佬解惑。
最佳答案
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 需要有效的按键,才能取到相应的按键及其扫描码,所以,程序会有等待。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 需要有效的按键,才能取到相应的按键及其扫描码,所以,程序会有等待。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-10 19:48:54 | 显示全部楼层
感谢解惑。刚学汇编不久,由于对操作系统这方面不是很了解,导致这个问题困扰了我一段时间在网上翻遍了都没有这方面的解答,加上书上和小甲鱼老师只是过了一遍程序没有运行,所以决定自己运行看看,在这过程中我就产生这方面的疑惑,不过看了你的解答后我明白了许多。顺便再问你一下现在Windows10还能调(diao)出实模式下的DOS吗?总之感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-10 19:52:53 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-10 19:54 编辑
向往前方ing 发表于 2022-10-10 19:48
感谢解惑。刚学汇编不久,由于对操作系统这方面不是很了解,导致这个问题困扰了我一段时间在网上翻遍了都没 ...


         不能,只能用类似于 DOS 虚拟机的软件,比如,DOSBox 来模拟 DOS 环境。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,先继续往后学吧,之后换一个虚拟机就可以用这样的代码了
例如,bochs,qemu
你可以给这些虚拟机添加软盘
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-10 21:40:10 | 显示全部楼层
我试了试这个代码,没问题
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-10 21:54:38 | 显示全部楼层
1.png
2.png
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-10 22:04:50 | 显示全部楼层
感谢解答.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表