如何在装配体(VGA模式,MASM,.386)中“绘制”字母?

时间:2019-05-11 16:41:29

标签: assembly x86 masm i386

我正在做一个大学项目,我真的很不擅长组装,所以请你帮忙。
“在VGA模式(320x200像素-256色)中,应该以垂直方向居中绘制两个字母(D和Q),高度至少为100像素。 高度将是可配置的,并存储到变量中,并且如果高度小于100像素,则不应运行。宽度和位置由您选择。“
我做了一些研究,结果就是代码,我知道这不完全符合我的要求,希望您能为我提供帮助。
1.对于VGA模式,我是否应该通过VGA电缆连接一台显示器以实际查看我的程序是否运行并且效果很好?
2.DS会自动从.DATA中获取数据吗?
3.使用系统调用时,应该等到按下键盘吗?
我们通常在大学notepad ++上使用带有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

1 个答案:

答案 0 :(得分:1)

由于您使用的是MASM和Int21h,因此我假设您的目标是DOS。应该提到过。

  1. VGA视频模式并不意味着您必须使用VGA电缆。
  2. 取决于。通常是这样。
  3. 您不能在DOS中使用syscall。使用中断16h,AH = 0读取密钥。

对于字符输出,我建议中断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

那样的。但是对您的要求有多个中断调用。

现在,关于构建和运行,您必须问一位老师。然后您通过构建和运行可执行文件对其进行测试。我确定他们在某些时候已经向您说明了如何;由于没有唯一正确的方法来构建汇编程序,因此我不知道您的教授期望什么,因此对此无济于事。