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