我用汇编语言才刚刚开始(觉得学习新的东西),并遇到了几个问题(到目前为止),所有我一直在寻找通过不回答,或者教程太旧就知道了。
1)我已经尝试了一些搜索(也许我只是不知道正确的关键字),但我无法找到的图形模式的更新列表改变屏幕分辨率,等我发现的最好的是: 汇编教程 ,和我很难认为是640×480的最佳分辨率汇编语言可以使用。 有谁知道更多,更新的教程中,我可以使用?
编辑:中断10H是老了,并不完全支持超过640×480
2)是否有可能“MOV”从可变另一个变量而无需首先将其移动到一个寄存器中的值? 例:
jmp start
n1 dw 0
n2 dw 0
res dw 0
start:
mov n1,5
mov n2,6
mov res,n1
add res,n2
...etc...
编辑:这是不可能的。 你不能从内存到内存,而无需使用寄存器。
3)问题1去,有没有一种方法来检测用户当前正在使用什么图形模式,这样我就可以改变它,回来后改变它呢? (我假设有,但我不知道该怎么做。)
编辑:需要查询OS的图形设置。
对于问题#1和#3,寻找到VESA BIOS扩展 。 这是对付“超级VGA”模式,在90年代流行的一个标准的东西。
至于#2,一般的答案是否定的,你不能MOV内存到内存。 但是,这并不完全正确:有MOVS(搬移字串),其中移动的字节,字,或从DS DWORD:SI到ES:DI。 通常该指令一起使用一个REP前缀来移动的存储器块。 另外,假设你有一个堆栈设置,你可以移动存储器到存储器,而通过推动和弹出重挫寄存器:
PUSH [mem1]
POP [mem2]
关于第一个问题,中断10是很老了,可能用不超过640 * 480的分辨率。 软件栈的不同部分是现在使用; 也就是说,你必须询问Windows来获得当前的屏幕分辨率。
这相当冗长后含有大量的如何使用汇编器来驱动的DirectX在Windows的详细信息。 DirectX是关键API系列图形这些天,你会不会来远用DOS时代的中断和VGA framebuffer的直接编程。
中断10H基本上是一个操作系统函数调用(实际上它运行BIOS代码)。 在内部,它读取显卡/写显存以及各种寄存器。 为了得到一个什么样的事情发生中断10小时“内”的想法,检查这出。
当你在Windows下运行DOS程序,它在一个虚拟DOS机运行。 Windows没有真正让它摸显卡,但它可以用一个虚拟的游戏。 通常,这只是一直延伸VGA屏幕模式(有时仅文本模式),即你有什么是虚拟VGA卡(不是一个现代的图形卡)。 出于这个原因,在Windows下16位汇编语言,你就不能使用现代图形卡的全部功能。
是的,当然,汇编语言可以让你做什么显卡能做到。 但是,只有当两种:
- 你的程序的图形硬件不受限制的访问(例如你正在写一个Windows或Linux设备驱动程序,或在纯DOS下,还是你自己的内核正在执行),或
- 你的程序经过相应的操作系统界面。
如果你仍然有兴趣在汇编语言,我建议你尝试写一个玩具内核。 这样做,你会学到东西山。
如果您想了解更多信息,发表评论。