Растяжение строки на весь экран с использованием видеорежима - 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
Коментарии:
  1. По поводу положения по вертикали и 1760. Переделываю свою прошлую программу, раньше необходимо было прибавить: 160б*11строк = 1760. Тогда я перескакивал на начало 11й строки, начало вывода определял регистр di. В этом коде я так понимаю начало вывода определяет регистр dl?
  2. Функцию подсчёта пробелов накидал на глаз, не знаю. будет ли работать, опять же, не знаю ассемблера и не работаю с ним.
  3. Компилирую всё в DOSbox, через tasm, потом tlink и после запускаю уже exe-шник, на экран выводится почему-то только первая буква строки, почему не инкриминируется si или это просто проблема с выводом - не знаю.
  4. При компиляции tlink пишет "Warning: No stack" - можно игнорировать?
  5. Наверное самый главный комментарий

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

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

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

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

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

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


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

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

10   голосов , оценка 3.7 из 5
Похожие ответы