2009-09-10 133 views
3

我用汇编语言才刚刚开始(觉得学习新的东西),并遇到了几个问题(到目前为止),所有我一直在寻找通过教程不回答,或者太老知道。一些x86汇编语言问题

1)我已经尝试了一些搜索(也许我只是不知道正确的关键字),但我无法找到的图形模式的更新列表改变屏幕分辨率,等我有最好的发现是:Assembler Tutorial,我不认为640x480是最好的分辨率汇编语言可以使用。 有谁知道我可以使用更新的教程?

编辑:中断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的图形设置。

+2

我不确定关于1和3(但如果他们是BIOS调用,那么_is_是你能做的最好的),2是不可能的。没有“将此内存位置移动到此内存位置”命令;你必须使用寄存器。 – 2009-09-10 14:53:11

+0

感谢迈克尔......我正在阅读教程,并认为我会更改代码,使其比示例稍微高效。在我尝试之前,它运行良好,并且无法弄清楚我是否犯了一个错误,或者是否无法启动。 – Sivvy 2009-09-10 15:04:58

回答

4

对于问题#1和#3,窥视VESA BIOS Extensions。这是处理90年代流行的“超级VGA”模式的标准。

至于#2,一般来说答案是否定的,你不能将MOV存储器存储到内存中。但这并非严格意义上的:有MOVS(移动字符串),它将字节,字或双字从DS:SI移动到ES:DI。通常,该指令与REP前缀结合使用来移动内存块。另外,假设你有一个堆栈设置,你可以移动存储器到存储器中,而被压入和弹出重挫寄存器:

PUSH [mem1] 
POP [mem2] 
2

关于你的第一个问题,中断10是很老了,可能用不超过640 * 480的分辨率。现在使用软件堆栈的不同部分;即,您将不得不询问Windows以获取当前的屏幕分辨率。

+0

是否有另一个比10更新的中断,但做了类似的事情?我不知道你是否会知道,但Windows如何做呢?我只能假设他们会使用汇编语言或编译汇编的语言......因此,我认为汇编可以做到这一点。 – Sivvy 2009-09-10 15:09:16

2

This rather verbose post含有大量的如何使用汇编器来驱动的DirectX在Windows的详细信息。目前,DirectX是图形的关键API家族,你不会使用DOS时代的中断,直接编程VGA帧缓冲。

1

中断10H基本上是一个操作系统函数调用(实际上它运行BIOS代码) 。在内部,它读取/写入视频内存以及图形卡上的各种寄存器。要了解在中断10h内发生了什么样的事情,请检查this

在Windows下运行DOS程序时,它在虚拟DOS机器中运行。 Windows实际上并没有让它触及显卡,而是让它与虚拟显示器一起玩。通常这只会扩展到VGA屏幕模式(有时只是文本模式),即您拥有的是虚拟VGA卡(不是现代图形卡)。因此,在Windows下的16位汇编语言中,您无法使用现代显卡的全部功能。

是的,当然,汇编语言可以让你做任何事情的图形卡可以做。但是,只有当任一:

  • 你的程序的图形硬件不受限制的访问(例如你正在写一个Windows或Linux设备驱动程序,或在纯DOS下,还是你自己的内核正在执行),或
  • 您的程序会通过相应的操作系统界面。

如果您仍然对汇编语言感兴趣,我会建议您尝试编写一个玩具内核。这样做,你会学到一大堆东西。

如果您需要更多信息,请留下评论。

+0

感谢您的输入......我想我可能会看看玩内核。初学者难吗? – Sivvy 2009-11-05 15:33:41

+2

当然很难!但是如果你喜欢解决棘手的挑战,这是非常有益的。启动的一种方法是将一些代码放入软盘或闪存驱动器的启动扇区,并从中启动计算机。并慢慢扩展其功能。给自己一份HelpPC(BIOS中断,数据格式和内存使用的好参考),并查看http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders – Artelius 2009-11-06 05:23:50