Растяжение строки на весь экран с использованием видеорежима - Assembler
Формулировка задачи:
Всем здравствуйте!
Ассемблер это моё наказание! Сижу уже 4й день, не могу на калякать простейшую задачку. Знаю, сейчас придут и начнут заявлять, что то я не так гуглю, то ещё что, но право слово, когда ты не знаешь вообще язык, тебе бы просто сдать и ты сшиваешь программу из чужих кусков - сложновато....
Что мне надо:
Что у меня есть:
Коментарии:
Написать программу на ассемблере, что бы она выводила по середине экрана (~на 11 строке), заданную строку через видеорежим. Но выводило не просто так! Между символами необходимо поставить определённое кол-во пробелов, что бы вся строка растягивалась на всю ширину экрана.
.model small
.data
_str db 'Hello!',0
num = $ - _str - 1
.code
start:
mov ax, @data
mov ds, ax
mov ax, 3
int 10h
mov bx, 0
mov ax, 0b800h
mov es, ax
mov ah, 04 ;цвет подсветки, потом цвет символов
xor di, 1760 ;положение по вертикали 1760 (11 сторка)
call out_str ;вызов процедуры вывода строки
int 16h
.exit
out_str:
mov si, 0
ckl:
mov dl, _str[si]
int 10h
call addspace ;тут вызываю функцию, которая выводит необходимое кол-во пробелов между буквами
int 10h
inc si
loop ckl
ret
addspase:
sub dl, num
div dl, num
ret
int 21h
end start- По поводу положения по вертикали и 1760. Переделываю свою прошлую программу, раньше необходимо было прибавить: 160б*11строк = 1760. Тогда я перескакивал на начало 11й строки, начало вывода определял регистр di. В этом коде я так понимаю начало вывода определяет регистр dl?
- Функцию подсчёта пробелов накидал на глаз, не знаю. будет ли работать, опять же, не знаю ассемблера и не работаю с ним.
- Компилирую всё в DOSbox, через tasm, потом tlink и после запускаю уже exe-шник, на экран выводится почему-то только первая буква строки, почему не инкриминируется si или это просто проблема с выводом - не знаю.
- При компиляции tlink пишет "Warning: No stack" - можно игнорировать?
Наверное самый главный комментарий
, простите, что выглядит всё дерьмово, я в этом вообще не разбираюсь, но учёба любит подкидывать сюрпризы... Не судите строго, просто пытаюсь сдать зачёт
Решение задачи: «Растяжение строки на весь экран с использованием видеорежима»
textual
Листинг программы
xor ah,ah int 16h .exit out_str: mov si, offset _str mov cx,num ckl: lodsb ; al=ds:[si], si=si+1 stosw ; es:[di]=ax, di=di+2 add di,(79/(num-1))*2 cmp cx,num/2+1 jne @@1 dec di dec di ; сдвигаем на 1 символ влево в середине (иначе будет 1 лишний пробел) @@1: loop ckl ret
Объяснение кода листинга программы
- Устанавливаем начальный адрес строки в регистр SI.
- Устанавливаем счётчик циклов в регистр CX.
- Начинаем цикл, в котором происходит: — Загрузка байта строки в регистр AL. — Запись в видеопамять двухбайта (1 символ + 1 пробел). — Увеличение адреса видеопамяти на 2. — Проверка, не достигли ли мы середины строки (для выравнивания строки по центру). — Если достигли, то у нас есть ещё один символ, который нужно вывести перед началом цикла. — Уменьшаем счётчик циклов на 1.
- Возвращаем управление в вызывающую программу.