【问题标题】:Is it possible to display an image to screen in ASM language, without using interrupts?是否可以在不使用中断的情况下以 ASM 语言在屏幕上显示图像?
【发布时间】:2021-08-21 22:45:33
【问题描述】:

是否可以在不使用任何 BIOS/DOR/... 中断的情况下以 ASM 语言在屏幕上显示像素或在扬声器中播放哔声?

【问题讨论】:

  • 只有在相关设备上有屏幕(或扬声器)时才有可能。任何可以用任何语言完成的事情都可以用 asm 完成,因为这最终是所有其他实际运行的语言都归结为的。
  • 那么,如何在 asm 中不中断地在屏幕上显示像素?我没有找到任何教程
  • 在 x86 上使用标准图形查找 VGA 教程。参见例如this one
  • @mpo 你正在为什么样的电脑和什么样的显卡编程?
  • 您必须以与操作系统相同的方式进行操作。你有知道特定板/芯片的代码,只需编写控制寄存器和像素数据,它就会显示在屏幕上。你不会找到任何关于 x86 系统的最新教程,但很容易找到其他系统。在 vga 时代,它被记录在案并且相当简单。

标签: performance assembly nasm x86-16 bare-metal


【解决方案1】:

这是可能的,但没用,因为每台 PC 都配备了固件(BIOS 或 UEFI),这些固件完成了最繁琐的工作。
很多年前我反汇编了Int 10/AH=00h的PC/XT BIOS代码,只是为了学习如何使用裸机将Hercules卡切换到图形模式,即指令IN和OUT应用于CRT ports

我在TechHelp 中找到的有关硬件的大部分信息,例如章节PC Sounds / Speaker Support 展示了如何通过使用OUT 61h,AL 发送方波并切换位1 来在主板扬声器上播放音调AL。引用 TechHelp:

The speaker is connected to PPI port B, port 61H.
Set bit 1 to pulse the speaker out and 
clear bit 1 to bring the speaker back to normal. 

         in    al,61H     ;get current value
  again: or    al,02H     ;set bit 2 to pulse it out
         out   61H, al
         mov   cx,1000H
  delay1:loop  delay1     ;wait a little while
         and   al,0fdH    ;clear bit 2 to pulse it back in
         out   61H, al
         mov   cx,1000H
  delay2:loop  delay2     ;wait a little while
         jmp   again

【讨论】:

  • 请不要发布这样的仅链接答案。即使所有链接都断开了,堆栈溢出的答案也必须自己有用。
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2022-12-11
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多