PDA

Просмотр полной версии : Логическое ИЛИ



Den1982
04.07.2012, 18:58
На досуге делаю первые шаги в АСМе, по книжке "Как написать компьютерную игру на ассемблере".
Вот пример из этой книжки (подпрограмма сдвига символа для эффекта волны):
"Подпрограмма вертикального скроллинга знакоместа может выглядеть так:

UP CP 32 ;проверка позиции перемещаемого знакоместа
RET NC ;выход, если больше или равна 32
LD HL,(AD_LIN) ;получаем адрес экрана начала строки
PUSH AF
OR L
LD L,A
PUSH HL
LD D,H ;копируем адрес в DE
LD E,L
LD B,7 ;повторяем 7 раз
UP1 INC H ;в HL - адрес байта следующего ряда
LD A,(HL) ;переносим из (HL) в (DE)
LD (DE),A
INC D ;переходим к следующему ряду
DJNZ UP1
LD (HL),0 ;обнуляем самый нижний ряд
POP HL
POP AF
RET

Перед обращением к этой (а также и к следующей) подпрограмме в аккумулятор нужно занести горизонтальную позицию знакоместа в строке. "
Никак не могу понять зачем нужна строка выделенная жирным... Да и что она делает тоже интерестно - складывает побитно содержимое регистра L? А зачем? хелп ми...:v2_dizzy_facepalm:

Oleg Origin
04.07.2012, 19:38
Этой командой совместно с последующей задается актуальный адрес знакоместа в указанной ранее строке. Тут нужно посмотреть на исходные данные: в (AD_LIN) у нас хранится уже высчитанный адрес начала строки, а в А - горизонтальная позиция знакоместа от 0 до 31. Дальше небольшая хитрость: адреса начала строк на экране выравнены по 32 (см. "строение экрана" в той же книге), и если перевести адрес начала любой строки в двоичный вид, то мы увидим, что "правые" 5 бит младшего байта адреса всегда будут равны нулю. А число в диапазоне от 0 до 31 занимает как раз пять бит. То есть, в данном случае получается, что командой OR L мы к горизонтальной позиции, которая хранится в А, прибавляем младший байт адреса строки. И следующей командой запихиваем его назад в L. А старший байт адреса, который хранится в H, - не изменяется.

bsivko
04.07.2012, 21:58
Все так, как сказал Oleg Origin.

Единственно добавлю, что тут "OR L" более логично заменить на "ADD A,L"
По памяти и тактам тжс, а с точки зрения логики программы смотрелось бы лучше. Кроме того, "ADD A,L" не завязан на нулевые младшие биты HL.

Den1982
04.07.2012, 22:22
Единственно добавлю, что тут "OR L" более логично заменить на "ADD A,L"
Ага, я до ADD еще не дошел еще, но в принципе по смыслу уже понятно что оно делает.-)