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