如何 "draw" 汇编中的一个字母(VGA模式,MASM,.386)?

How to "draw" a letter in assembly(VGA mode, MASM, .386)?

我正在做一个大学项目,我的汇编很糟糕,所以我请求你的帮助。
"In the VGA mode (320x200 pixels -256 colors) it should been "drawing" 2 个字母(D 和 Q),垂直居中,高度至少为 100 像素。 高度将是可配置的并存储到一个变量中,如果高度低于 100 像素,则不应 运行。宽度和它们的位置是可以选择的。"
我做了一些研究,代码是我的结果,我知道它不完全符合我的要求,我希望你能帮助我。
1.For VGA 模式我应该通过 VGA 电缆连接显示器以实际查看我的程序 运行 是否正常吗?
2.It DS 自动从 .DATA 中获取数据是真的吗?
3.With 应该等到按下键盘的系统调用?
我们通常在大学里使用带有 masm 插件和 ollydbg 作为调试器的记事本 ++,但只要他们做应该做的事情,我就持开放态度。它必须是 .386.
提前致谢,特别感谢您阅读到这里。

.386
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;including msvcrt.lib, and declaring what function to import
includelib msvcrt.lib
extern exit: proc 
;declare the symbol start as public - from there execution starts
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;declaring data we are using
data segment
 letter1 db 'D'
 letter2 db 'Q'
 COLORTEXT    equ   7

.code

_InitializeMCGA PROC

MOV AX, 0A000h
MOV ES, AX ; ES now points to the VGA

MOV AH, 00H ; Set video mode
MOV AL, 13H ; Mode 13h
INT 10H ; We are now in 320x200x256
RET

_InitializeMCGA ENDP

start:

    ;MOV AX, @DATA
    ;MOV DS, AX ; DS now points to the data segment.
    ;those 2 instructions above are commented because I read that DS is taking automatically the data from .DATA
    ;let me know if it's wrong 

    CALL _InitializeMCGA ; ENTER MODE 13H
    MOV AH, letter1
    MOV ES, AX
    MOV BP, OFFSET COLORTEXT ; ES: BP POINTS TO THE TEXT
    MOV AH, 13H ; WRITE THE STRING
    MOV AL, 01H; ATTRIBUTE IN BL, MOVE CURSOR TO THAT POSITION
    XOR BH,BH ; VIDEO PAGE = 0
    MOV BL, COLORTEXT ;colour (7=white as far as I know)
    MOV CX, 25 ; LENGTH OF THE STRING
    MOV DH, 50 ;ROW TO PLACE STRING
    MOV DL, 10; COLUMN TO PLACE STRING
    syscall ;wait for keyboard to be pressed

    MOV AX, 4C00H ;dos exit
    INT 21H  ; Return to DOS
    ;finish the program
end start

由于您使用的是 MASM 和 Int21h,因此我认为您的目标是 DOS。早该这么说了。

  1. VGA 视频模式并不意味着您必须使用 VGA 线。
  2. 视情况而定。通常是这样。
  3. 您不能在 DOS 中使用 syscall。使用中断16h,AH=0读取一个key。

对于字符输出,我建议中断 10h,功能 9。使用功能 2 定位光标。

编辑:

首先,您查找中断文档。甚至维基百科 provides some.

然后在代码中,根据规范为寄存器赋值,并调用中断。例如,对于 INT 10 函数 2,它将是:

mov ah, 2h ; the function
mov bh, 0 ; the page - assume 0
mov dh, 1 ; row
mov dl, 5 ; column
int 10h

有点像。但是你的要求不止一个中断调用。

现在,关于建筑和 运行,你必须请教老师。然后您通过构建和 运行 可执行文件来测试它。我敢肯定他们已经在某个时候向您解释了如何做;由于没有唯一正确的方法来构建汇编程序,我不知道您的教授期望什么,因此对此无能为力。