Растяжение строки на весь экран с использованием видеорежима - 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.
- Возвращаем управление в вызывающую программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д