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

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

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

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

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

textual
Листинг программы
xor ah,ah
mov al,03h
int 10h
 
mov ax,0B800h 
mov es,ax 
mov di,3*160+4 
 
mov ah,es:[di+1]  
or ah,0F0h 
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
Похожие ответы