Перекрасить по некоторым координатам ячейку в другой цвет - 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-битного процессора, то он может работать некорректно, так как он предполагает, что сегментный адрес и смещение в памяти будут иметь одинаковую длину.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д