Инструкция языка ассемблера в инструкцию машинного языка

Ссылка: reference Вопрос: question

Я не получаю те же значения, что и в их ответе.

Код операции для ld (немедленное) — 0x31 = 0011 0001. Значение — 0x10A = 0001 0000 1010. Я не знаю, как здесь учитывать регистр Ri.

Физический формат ld (0x31) состоит из двух слов.

Слово 1: биты 7-2 предназначены для кода операции. Поэтому двоичная последовательность для ld укорачивается до 110001 бит.

биты 1-0 для Ri.

Слово 2: все 8 бит зарезервированы для значения

10A = 0001 0000 1010 сокращается до ... 0000 1010? А 0001? :(

Мой результат - 1100 01 Ри 0000 1010.


person Egyptian_Coder    schedule 20.07.2016    source источник


Ответы (2)


Глядя на документацию, включенную в вопрос, предлагается несколько инструкций. Машина имеет четыре 8-битных регистра, пронумерованных R0, R1, R2 и R3, которые адресуются с использованием двух битов.

Коды операций для инструкций указаны в документации в виде двух шестнадцатеричных цифр. Однако в реальной реализации область кода операции инструкций не имеет размера двух шестнадцатеричных цифр, поэтому вам нужно взять шестнадцатеричное значение и сдвинуть значение влево на 2 бита. Таким образом, код операции для загрузки 0x30 (0011 0000) сдвигается влево, что приводит к 0xC0 (1100 0000 в двоичном формате), или код операции для сохранения 0x32 (0011 0010) сдвигается влево, что приводит к 0xC8 (1100 1000) и номер регистра от нуля до трех вставляется в младшие два бита двух шестнадцатеричных цифр.

Команда загрузки из адреса имеет вид ld Ri,xxxx, где xx — 16-битный адрес ячейки, содержащей 8-битное значение для загрузки в регистр. Эта инструкция загрузки устанавливает указанный 8-битный регистр (R0, R1, R2 или R3) с 8-битным значением по указанному адресу.

Фактические битовые форматы для инструкции загрузки: (1) код операции (0x30) в старших 6 битах, за которым следует (2) номер регистра (0–3) в следующих двух битах, за которым следует (3) 16-битный значение, которое является адресом значения для загрузки.

Затем ld R1,0x10A должен выглядеть как 1100 0001 0000 0001 0000 1010 в двоичном формате, который разделен на 1100 00 как код операции 0x30, 01 как номер регистра R1 и 0000 0001 0000 1010, который равен 0x010A.

Немедленная загрузка ld R3,$-12 должна выглядеть как 1100 0111 1111 0400, поскольку -12 равно 0xfff4.

add R1,R3 должен выглядеть как 0100 0001 1100 0000, предполагая, что неиспользуемые биты равны нулю. Это будет 010000 в качестве кода операции 0x10 для добавления, 01 для регистра R1 и 11 для регистра R3. Оставшиеся 6 бит во второй 8-битной части инструкции добавления не используются и игнорируются.

sto R1,0x10B должен выглядеть как 1100 1001 0000 0001 0000 1011, что является кодом операции 0x32, регистр 1, который должен храниться по 16-битному адресу 0x010B.

person Richard Chambers    schedule 20.07.2016

Да, ответ на изображении неверен, это для 0x10D, а не для 0x10A. Ваш тоже не прав.

Во-первых, ld имеет две версии: одну для загрузки памяти и одну для постоянной загрузки. Тот, о котором идет речь, - это загрузка памяти, и у нее есть код операции 0x30. Ri — это просто номер регистра для операнда, и здесь явно 1. Таким образом, первый байт выглядит как 1100 0001 (на картинке это правильно). Затем вам просто нужно поставить константу после нее в виде двух байтов, с прямым порядком байтов.

Итак, правильный ответ 1100 0001 0000 0001 0000 1010

person Jester    schedule 20.07.2016
comment
еще раз спасибо Jester, ясно, что я перепутал режимы прямого и прямого адреса на картинке - person Egyptian_Coder; 20.07.2016