Перекрасить по некоторым координатам ячейку в другой цвет - Assembler
Формулировка задачи:
Здравствуйте!) Делаю лабораторную по ассемблеру, все как-то на ощупь, потому что особого понимания, в отличие, например, от си, нет... Все очень сложно))
Эта программа должна перекрашивать по некоторым координатам ячейку в другой цвет, а именно 3 элемент в 3 строке
Но нет понимания, что происходит тут...
1) По идее, тут должен выделяться 4 элемент
, а выделяется 3
2) И что это?
3) Вот тут мы помещаем
содержимое по адресу 0b800h из видеопамяти в регистр ax?
Потому что преподаватель просто показывал и объяснял, что происходит, а что это значит, не особо понятно
Спасибо всем)
Листинг программы
- mov si,3*160+4
Листинг программы
- int 21h
Листинг программы
- mov ax,0b800h
Листинг программы
- 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
Объяснение кода листинга программы
- xor ah,ah — приводит к побитному исключающему или булеву операции для переменных в регистре AH и AH. Результат — 0, и мы можем считать, что мы очистили AH для использования в качестве счётчика.
- mov al,03h — копирует 03h (3) в AL. Это будет использоваться как смещение для наших операций чтения/записи.
- int 10h — вызывает функцию BIOS, которая выводит символ на экран. В данном случае, мы выводим символ с кодом 3 (03h).
- mov ax,0B800h — копирует 0B800h в AX. 0B800h — это сегментный адрес начала видео-RAM (для текста на экране).
- mov es,ax — копирует сегментный адрес из AX в ES. Теперь ES содержит сегментный адрес видео-RAM.
- *mov di,3160+4** — вычисляет смещение в диапазоне от 0 до 160 (для 70 символов в строке) и добавляет 4 (для учета границы между строками). Результат — смещение в памяти, где находится символ, который мы хотим изменить.
- mov ah,es:[di+1] — читает байт из видео-RAM по смещению (в AL) и копирует его в AH. В данном случае, мы читаем символ, который находится на позиции 3 строки (03h) и 2-го столбца (1).
- or ah,0F0h — выполняет побитное ИЛИ с 0F0h (150h) и значением, которое мы только что прочитали из видео-RAM. Результат — новый цвет для ячейки (смешение цвета фона и цвета символа).
- mov es:[di+1],ah — записывает новое значение AH обратно в видео-RAM по тому же смещению. Мы только что изменили цвет символа на позиции 3 строки (03h) и 2-го столбца (1). Похоже, что этот код должен перекрасить символ на позиции 3 строки и 2-го столбца в другой цвет. Но для этого необходимо, чтобы сегментный адрес видео-RAM был корректно установлен и чтобы была поддержка видео-RAM на уровне BIOS. Кроме того, если этот код был написан для 16-битного процессора, то он может работать некорректно, так как он предполагает, что сегментный адрес и смещение в памяти будут иметь одинаковую длину.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д