Нужно чтобы каждая буква была своего цвета - Assembler

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

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

Здравствуйте. Я в ассемблере плохо разбираюсь, поэтому прошу вас о помощи. По заданию нужно каждую букву выделять собственным цветом name "hello"
org 100h
jmp start 
msg: db "Veni, vidi vici", 00h, 0ah,24h
start: mov dx, msg
mov ah, 09h
int 21h
mov ah, 0
int 16h
ret

Решение задачи: «Нужно чтобы каждая буква была своего цвета»

textual
Листинг программы
org 100h
jmp start 
 
msg   db  'H',7,'e',8,'l',9,'l',10,'o',11      ; мессага с атрибутами
len   =   $ - msg                              ; её длина
 
start:  mov   ax,3         ; видео-мода: 80х25/16-цветов
        int   10h
 
        push  0 0b800h     
        pop   es di        ; ES:DI = видеобуфер
        mov   si,msg       ; адрес мессаги
        mov   cx,len       ; её длина
        rep   movsb        ; скопировать из SI в DI (сх-байт)
 
        mov   ah,0         ; клава
        int   16h
        ret                ; на выход!

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

Выполняемый файл на языке ассемблера, как правило, не содержит пояснений и комментариев, которые бы поясняли, что делает тот или иной участок кода. Это довольно распространённая практика для такого рода программных продуктов, предназначенных для решения узкой задачи. В представленном вами коде, по всей видимости, реализована функция вывода на экран сообщения с определёнными атрибутами (в данном случае — цветом каждой буквы) с помощью встроенной функции BIOS int 10h. Для более удобного понимания, ниже представлена разбивка на пронумерованные этапы:

  1. org 100h — начало работы, установка сегментного регистра для начала адресации в памяти
  2. jmp start — переход к точке входа в программу
  3. msg db 'H',7,'e',8,'l',9,'l',10,'o',11 — строка-сообщение, каждая буква которого имеет свой цвет (атрибут)
  4. len = $ — msg — длина сообщения в байтах (считая символы пробелов)
  5. start: mov ax,3 — установка видео-мода (80x25, 16 цветов)
  6. int 10h — вызов функции BIOS для установки видео-мода
  7. push 0 b800h — начало записи видеобуфера (ES:DI)
  8. pop es di — конец записи видеобуфера (ES:DI)
  9. mov si,msg — начальный адрес сообщения
  10. mov cx,len — длина сообщения в байтах
  11. rep movsb — копирование сообщения из области памяти по адресу SI в видеобуфер (ES:DI)
  12. mov ah,0 — установка регистра для работы с клавиатурой
  13. int 16h — вызов функции BIOS для работы с клавиатурой
  14. ret — выход из программы Пожалуйста, обратите внимание, что список может быть неполным и не учитывать некоторые нюансы, если таковые имеются. Если вам необходима более подробная информация, вы можете обратиться к документации к используемой вами Assembler-системе или задать более конкретный вопрос.

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


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

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

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