Перекрасить по некоторым координатам ячейку в другой цвет - Assembler

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

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

Здравствуйте!) Делаю лабораторную по ассемблеру, все как-то на ощупь, потому что особого понимания, в отличие, например, от си, нет... Все очень сложно)) Эта программа должна перекрашивать по некоторым координатам ячейку в другой цвет, а именно 3 элемент в 3 строке Но нет понимания, что происходит тут... 1) По идее, тут должен выделяться 4 элемент
Листинг программы
  1. mov si,3*160+4
, а выделяется 3 2) И что это?
Листинг программы
  1. int 21h
3) Вот тут мы помещаем
Листинг программы
  1. mov ax,0b800h
содержимое по адресу 0b800h из видеопамяти в регистр ax? Потому что преподаватель просто показывал и объяснял, что происходит, а что это значит, не особо понятно Спасибо всем)
Листинг программы
  1. code segment
  2. start:
  3. mov ax,0b800h
  4. mov ds,ax
  5. mov si,3*160+4
  6. mov ah,ds:[si+1]
  7. and ah,0fh
  8. or ah,0f0h
  9. mov ds:[si+1],ah
  10. mov ah,4ch
  11. int 21h
  12. code ends
  13. end start

Решение задачи: «Перекрасить по некоторым координатам ячейку в другой цвет»

textual
Листинг программы
  1. xor ah,ah
  2. mov al,03h
  3. int 10h
  4.  
  5. mov ax,0B800h
  6. mov es,ax
  7. mov di,3*160+4
  8.  
  9. mov ah,es:[di+1]  
  10. or ah,0F0h
  11. mov es:[di+1],ah

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

  1. xor ah,ah — приводит к побитному исключающему или булеву операции для переменных в регистре AH и AH. Результат — 0, и мы можем считать, что мы очистили AH для использования в качестве счётчика.
  2. mov al,03h — копирует 03h (3) в AL. Это будет использоваться как смещение для наших операций чтения/записи.
  3. int 10h — вызывает функцию BIOS, которая выводит символ на экран. В данном случае, мы выводим символ с кодом 3 (03h).
  4. mov ax,0B800h — копирует 0B800h в AX. 0B800h — это сегментный адрес начала видео-RAM (для текста на экране).
  5. mov es,ax — копирует сегментный адрес из AX в ES. Теперь ES содержит сегментный адрес видео-RAM.
  6. *mov di,3160+4** — вычисляет смещение в диапазоне от 0 до 160 (для 70 символов в строке) и добавляет 4 (для учета границы между строками). Результат — смещение в памяти, где находится символ, который мы хотим изменить.
  7. mov ah,es:[di+1] — читает байт из видео-RAM по смещению (в AL) и копирует его в AH. В данном случае, мы читаем символ, который находится на позиции 3 строки (03h) и 2-го столбца (1).
  8. or ah,0F0h — выполняет побитное ИЛИ с 0F0h (150h) и значением, которое мы только что прочитали из видео-RAM. Результат — новый цвет для ячейки (смешение цвета фона и цвета символа).
  9. mov es:[di+1],ah — записывает новое значение AH обратно в видео-RAM по тому же смещению. Мы только что изменили цвет символа на позиции 3 строки (03h) и 2-го столбца (1). Похоже, что этот код должен перекрасить символ на позиции 3 строки и 2-го столбца в другой цвет. Но для этого необходимо, чтобы сегментный адрес видео-RAM был корректно установлен и чтобы была поддержка видео-RAM на уровне BIOS. Кроме того, если этот код был написан для 16-битного процессора, то он может работать некорректно, так как он предполагает, что сегментный адрес и смещение в памяти будут иметь одинаковую длину.

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


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

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

15   голосов , оценка 3.933 из 5

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

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

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