如何 "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。早该这么说了。
- VGA 视频模式并不意味着您必须使用 VGA 线。
- 视情况而定。通常是这样。
- 您不能在 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
有点像。但是你的要求不止一个中断调用。
现在,关于建筑和 运行,你必须请教老师。然后您通过构建和 运行 可执行文件来测试它。我敢肯定他们已经在某个时候向您解释了如何做;由于没有唯一正确的方法来构建汇编程序,我不知道您的教授期望什么,因此对此无能为力。
我正在做一个大学项目,我的汇编很糟糕,所以我请求你的帮助。
"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。早该这么说了。
- VGA 视频模式并不意味着您必须使用 VGA 线。
- 视情况而定。通常是这样。
- 您不能在 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
有点像。但是你的要求不止一个中断调用。
现在,关于建筑和 运行,你必须请教老师。然后您通过构建和 运行 可执行文件来测试它。我敢肯定他们已经在某个时候向您解释了如何做;由于没有唯一正确的方法来构建汇编程序,我不知道您的教授期望什么,因此对此无能为力。