答案 0 :(得分:2)
典型的惯例是使用ds:si
作为来源,es:di
作为目的地。
所以它最终会与(未经测试)类似:
mov ax, @data
mov ds, ax
mov ax, ScreenSeg
mov es, ax
...
mov si, offset MyMsg
OutputString:
mov al, byte ptr ds:[si]
mov byte ptr es:[di], al
add si, 1 ; next character from string
add di, 2 ; skip over next attribute code in vga memory.
loop OutputString
答案 1 :(得分:2)
如果您还没有Masm32 Package,我建议您这样做。它主要是为了在“今日Windows”中轻松使用汇编语言,这非常好,但也会教你很多关于Asm的信息,并且还显示了在早期回复中提到的必不可少的英特尔芯片手册的位置。
我在80年代开始编程,所以我可以看出为什么你对它的细节如此感兴趣,我知道我很想念它。如果有更多的人从那里开始,那将非常有收益。你正在做一个很棒的服务!
我正在玩你正在谈论的直接硬件,我也了解到Windows已经改变了一些DOS服务,BIOS服务也发生了变化,因此有些不再工作了。我实际上正在编写一个小的.com程序并在命令提示符窗口中从Win7运行它,打印一个消息并等待一个密钥,非常酷,考虑到2012年的Win7!
事实上,它是BIOS 10h - 0Eh不起作用,所以我尝试了Dos 21h 02h写入屏幕,它的工作原理。代码如下,因为它是一个.com(命令程序),我认为它可能对你有用。
这使得.com程序(64k限制,代码,数据和所有 ;必须适应这个空间。用于小型实用程序和 ;适合非常快速的任务。实际上DOS命令主要是 ;像这样的小.com程序(除了更有用)! ; ;使用Masm组装 ; c:\ masm32 \ bin \ ml / AT / c bfc.asm ;使用Masm的Link16链接 ; c:\ masm32 \ bin \ link16 bfc.obj,bfc.com; ; ; Link16是制作这个16bit .com(命令)文件的关键
SEGMT SEGMENT
org 100h
Start:
push CS
pop DS
MOV SI, OFFSET Message
Next:
MOV ah, 02h ; Write Char to Standard out
MOV dl, [si] ; Char
INT 21h ; Write it
INC si ; Next Char
CMP byte ptr[si], 0 ; Done?
JNE Next ; Nope
WaitKey:
XOR ah, ah ; 0
INT 16h ; Wait for any Key
ExitHere:
MOV ah, 4Ch ; Exit with Return Code
xor al, al ; Return Code
INT 21h
Message db "It Works in Windows 7!", 0
SEGMT ENDS
END Start
答案 2 :(得分:0)
我曾经做过你所说的所有事情。试着记住细节。 Michael Abrash是一个你应该用Google搜索的名字。模式-X例如200乘200(240x200?)256色模式非常受欢迎,因为它打破了16色边界,当时游戏看起来非常好。
我认为金属寄存器编程是可行但痛苦的,你可能需要为你感兴趣的芯片获得程序员参考/数据表。随着时间的推移,从CGA到EGA到VGA再到VESA的工作方式改变了。我认为通常你使用int调用来访问页面框架,然后你可以直接填写它。 VESA我认为这样做,VESA在视频卡支持方面是一个很大的助手,你以前必须为每个芯片编写自己的驱动程序(如果你不想要丑陋的标准模式)。
我会看看mode-x或vesa并从那里开始。无论如何,你需要在里面有一些黑客来完成其中的一些,很难找到一个完整而准确的数据表/程序员参考手册,你总是只需要推一些字节来看看会发生什么。开始填充那些应该是页面框架的内存块,直到你在屏幕上看到一些变化......
我没有在图书馆看到任何特定的图形编程书籍,而不是像图形编程黑皮书那样的书籍,这是在这段时间的尾声。我有bios和dos程序员参考,也使用ralf browns列表。我确信我有流行视频芯片手册的副本(在互联网之前记得你在那个电话上叫人类用绳子悬挂它,人类拿了一本印刷手册,有时很好地绑定了有时只是一个主食如果那个角落,把它放在一个信封里并邮寄给你,这是你唯一的副本,除非你通过复印机运行它)。我有很多印刷的东西,不好意思,我不打算回答这个问题。我会在脑海中记住这个问题并查看更多信息,实际上我可能会有一些旧的程序,绘制分形和其他类似的东西(直接对视频卡/内存实用)。
EDIT。
我知道你正在寻找文字模式的东西,这是一种图形模式,但它可能会或可能不会对你想要做的事情有所了解。直接调用int调用和填充页面以及调色板内存。