Растяжение строки на весь экран с использованием видеорежима - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем здравствуйте! Ассемблер это моё наказание! Сижу уже 4й день, не могу на калякать простейшую задачку. Знаю, сейчас придут и начнут заявлять, что то я не так гуглю, то ещё что, но право слово, когда ты не знаешь вообще язык, тебе бы просто сдать и ты сшиваешь программу из чужих кусков - сложновато.... Что мне надо:
Написать программу на ассемблере, что бы она выводила по середине экрана (~на 11 строке), заданную строку через видеорежим. Но выводило не просто так! Между символами необходимо поставить определённое кол-во пробелов, что бы вся строка растягивалась на всю ширину экрана.
Что у меня есть:
Листинг программы
  1. .model small
  2. .data
  3. _str db 'Hello!',0
  4. num = $ - _str - 1
  5. .code
  6. start:
  7. mov ax, @data
  8. mov ds, ax
  9. mov ax, 3
  10. int 10h
  11. mov bx, 0
  12. mov ax, 0b800h
  13. mov es, ax
  14. mov ah, 04 ;цвет подсветки, потом цвет символов
  15. xor di, 1760 ;положение по вертикали 1760 (11 сторка)
  16. call out_str ;вызов процедуры вывода строки
  17. int 16h
  18. .exit
  19. out_str:
  20. mov si, 0
  21. ckl:
  22. mov dl, _str[si]
  23. int 10h
  24. call addspace ;тут вызываю функцию, которая выводит необходимое кол-во пробелов между буквами
  25. int 10h
  26. inc si
  27. loop ckl
  28. ret
  29. addspase:
  30. sub dl, num
  31. div dl, num
  32. ret
  33. int 21h
  34. end start
Коментарии:
  1. По поводу положения по вертикали и 1760. Переделываю свою прошлую программу, раньше необходимо было прибавить: 160б*11строк = 1760. Тогда я перескакивал на начало 11й строки, начало вывода определял регистр di. В этом коде я так понимаю начало вывода определяет регистр dl?
  2. Функцию подсчёта пробелов накидал на глаз, не знаю. будет ли работать, опять же, не знаю ассемблера и не работаю с ним.
  3. Компилирую всё в DOSbox, через tasm, потом tlink и после запускаю уже exe-шник, на экран выводится почему-то только первая буква строки, почему не инкриминируется si или это просто проблема с выводом - не знаю.
  4. При компиляции tlink пишет "Warning: No stack" - можно игнорировать?
  5. Наверное самый главный комментарий

    , простите, что выглядит всё дерьмово, я в этом вообще не разбираюсь, но учёба любит подкидывать сюрпризы... Не судите строго, просто пытаюсь сдать зачёт

Решение задачи: «Растяжение строки на весь экран с использованием видеорежима»

textual
Листинг программы
  1. xor ah,ah
  2. int 16h
  3. .exit
  4.  
  5. out_str:
  6. mov si, offset _str
  7. mov cx,num
  8. ckl:
  9.  
  10.     lodsb  ; al=ds:[si], si=si+1
  11.     stosw  ; es:[di]=ax, di=di+2
  12.     add di,(79/(num-1))*2
  13.     cmp cx,num/2+1
  14.     jne @@1
  15.     dec di
  16.     dec di  ; сдвигаем на 1 символ влево в середине (иначе будет 1 лишний пробел)
  17. @@1:
  18.     loop ckl
  19. ret

Объяснение кода листинга программы

  1. Устанавливаем начальный адрес строки в регистр SI.
  2. Устанавливаем счётчик циклов в регистр CX.
  3. Начинаем цикл, в котором происходит: — Загрузка байта строки в регистр AL. — Запись в видеопамять двухбайта (1 символ + 1 пробел). — Увеличение адреса видеопамяти на 2. — Проверка, не достигли ли мы середины строки (для выравнивания строки по центру). — Если достигли, то у нас есть ещё один символ, который нужно вывести перед началом цикла. — Уменьшаем счётчик циклов на 1.
  4. Возвращаем управление в вызывающую программу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы