2012-04-06 2 views
0

Я делаю и выполняю домашние задания в симуляторе MARS (Assembly), и я застрял на одной части. Нам не нравится загружать в реестр 32-битное слово. Биты от 0 до 7 представляют синий цвет, бит от 8 до 15 - зеленый цвет, а бит от 16 до 23 - красный. Остальные биты устанавливаются на ноль. Например, желтый цвет равен 0x00ffff00.Бит арифметики - объединить два результата в один бит

Домашнее задание разделено на задание дерева, и я нахожусь на последнем. У нас есть 64-х 64-пиксельный дисплей (каждый пиксель составляет 4 * 4, поэтому общая ширина и высота - 256). Красный цвет всегда установлен в 0, зеленый - 4 * номер строки, а синий - 4 * номер столбца. Представьте, что мы находимся в 2 строках и 3 строках, зеленые значения будут 2 * 4 и синее значение 3 * 4. Итак, в этом примере в шестнадцатеричном виде 12 будет 0xc и 8 0x08, а число, которое должно быть загружено в реестр, будет 0x00000c08.

Итак, мое первое сомнение в том, как я могу использовать битовую алгебру, чтобы объединить результат двух умножений?
И мое второе сомнение в этом. Представьте, что мы последний пиксель, который мы должны выполнить 64 * 4 и 64 * 4. Результат - 256, и мы не можем использовать только 8 бит для представления этого числа, поэтому, вероятно, я не должен использовать пиксели от 1 до 64, а от 0 до 63. Правильно?

+0

использования двоичных сдвигов или умножать на 2^п. Какой процессор кстати? – BlackBear

+0

думаю 0-63 нет 1-64. 63 = 0x3F 63 * 4 = 0x3F << 2 = 0xFC, который помещается в пределах 8 бит без проблем. –

+0

Windows с процессором x64. Что будет в приведенном примере? Извините, но я не понимаю. – Favolas

ответ

1

Итак, у вас есть 0x08 и 0x0C, и вы хотите 0x0C08?

Посмотрите немного сдвигая

В C, как языки было бы что-то вроде

(0x0C << 8) | 0x08 

(0x0C << 8) gives 0x0C00 
+1

Не хотите сказать '(0x0C << 8) | 0x08'? – harold

+0

Да, я имел в виду это, рад видеть, что кто-то обращает внимание –

+0

@TonyHopkinson Спасибо. С вашим предложением удалось решить мою проблему :) – Favolas

Смежные вопросы