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

Ссылка: ссылка Вопрос: вопрос

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

Код операции для 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 Ri 0000 1010.

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.

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

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

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

Другие вопросы по тегам