我刚刚开始使用汇编语言(感觉就像学习新东西一样),并且遇到了一些问题(到目前为止),我一直在寻找的所有教程都没有回答,或者说太旧了知道。
1)我尝试了一些搜索(也许我只是不知道正确的关键字),但我找不到更新屏幕分辨率等图形模式的更新列表。我找到的最好的是:Assembler Tutorial,我几乎不认为640x480是最好的分辨率汇编语言可以使用。 有谁知道我可以使用更新的教程?
编辑:中断10h已过时,并且支持不超过640x480
2)是否可以将值从变量“移动”到另一个变量而不先将其移动到寄存器?例如:
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,是否有办法检测用户当前使用的图形模式,以便我可以更改它,然后将其更改回来? (我假设有,但我不知道该怎么做。)
编辑:需要查询操作系统的图形设置。
答案 0 :(得分:4)
对于问题#1和#3,请查看VESA BIOS Extensions。这是处理90年代流行的“超级VGA”模式的标准。
至于#2,一般答案是否定的,你不能将MOV内存存储到内存中。但事实并非如此:有MOVS(移动字符串),它将字节,字或双字从DS:SI移动到ES:DI。通常,此指令与REP前缀一起使用以移动内存块。此外,假设您已经设置了堆栈,您可以通过推送和弹出来移动内存到内存而不会破坏寄存器:
PUSH [mem1]
POP [mem2]
答案 1 :(得分:2)
关于你的第一个问题,中断10很老,可能不会超出640x480的分辨率。现在使用软件堆栈的不同部分;即,你必须询问Windows以获得当前的屏幕分辨率。
答案 2 :(得分:2)
This rather verbose post包含有关如何使用汇编程序在Windows中驱动DirectX的大量详细信息。 DirectX是目前图形处理的关键API系列,你不会使用DOS时代的中断并直接编程VGA帧缓冲区。
答案 3 :(得分:1)
中断10h基本上是一个操作系统函数调用(实际上它运行BIOS代码)。在内部,它读/写视频内存以及显卡上的各种寄存器。要了解在“内部”中断10h内发生什么类型的事情,请检查this输出。
在Windows下运行DOS程序时,它在虚拟DOS机器上运行。 Windows实际上并没有让它触摸显卡,而是让它与虚拟显卡一起玩。通常这只延伸到VGA屏幕模式(有时只有文本模式),即你拥有的是虚拟VGA卡(不是现代显卡)。因此,在Windows下的16位汇编语言中,您无法使用现代图形卡的全部功能。
是的,当然,汇编语言可以让你做任何图形卡可以做的事情。但只有在以下情况之一:
如果您仍然对汇编语言感兴趣,我建议您尝试编写一个玩具内核。这样做,你将学到很多东西。
如果您想了解更多信息,请发表评论。