Как «нарисовать» букву в сборке (режим VGA, MASM, .386)? - PullRequest
1 голос
/ 11 мая 2019

Я занимаюсь университетским проектом, и я очень плохо разбираюсь, поэтому прошу вашей помощи.
"В режиме VGA (320x200 пикселей -256 цветов) он должен" рисовать "2 буквы (D и Q) центрированы по вертикали с высотой не менее 100 пикселей. Высота будет настраиваться и сохраняться в переменной, и она не должна работать, если высота меньше 100 пикселей. Ширина и их положение - на выбор. "
Я провел некоторое исследование, и код - это мой результат, и я знаю, что он не совсем соответствует моим требованиям, и я надеюсь, что вы мне поможете.
1.Для режима VGA мне нужно подключить монитор через кабель VGA, чтобы увидетьесли моя программа работает и все в порядке?
2. Это правда, что DS автоматически берет данные из .DATA?
3. При системном вызове следует ждать, пока клавиатура нажата?
Обычно мы используемуниверситетский блокнот ++ с плагином 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 Ответ

1 голос
/ 11 мая 2019

Поскольку вы используете MASM и Int21h, я предполагаю, что вы ориентируетесь на DOS.Должно быть упомянуто так.

  1. Режим видео VGA не означает, что вы должны использовать кабель VGA.
  2. Зависит.Обычно это так.
  3. Вы не можете использовать syscall в DOS.Используйте прерывание 16h, AH = 0 для чтения клавиши.

А для символьного вывода я бы рекомендовал прерывание 10h, функция 9. Для позиционирования курсора используйте функцию 2.

РЕДАКТИРОВАТЬ:

Сначала вы посмотрите документацию прерывания.Даже Википедия предоставляет некоторые .

Затем в коде вы присваиваете значения регистрам в соответствии со спецификацией и вызываете прерывание.Например, для 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

Вроде как.Но есть более одного вызова прерывания по вашим требованиям.

Теперь, что касается сборки и работы, вам нужно будет спросить учителя.И вы проверяете это путем сборки и запуска исполняемого файла.Я уверен, что они объяснили вам, как в какой-то момент;поскольку не существует единственно правильного способа сборки ассемблерных программ, я не знаю, чего ожидает ваш профессор, и поэтому не могу с этим сильно помочь.

...