Запутался в двоичном коде инструкции MVI в коде инструкции 8085. Посмотри пожалуйста

Рассмотрим инструкцию MVI A,32H для загрузки 32H в регистр A (микропроцессор Intel 8085).

В моей книге написано, что это двухбайтовая инструкция, где первый байт — это код операции, а второй — операнд. Первый байт равен 0011 1110 (3E в шестнадцатеричном формате), а второй байт равен 0011 0010 (32 в шестнадцатеричном формате).

Я не понимаю, как именно часть кода операции преобразуется в машинный код. Я имею в виду... какая часть "0011 1110" означает "MVI" и какая часть говорит о том, что регистр A должен быть загружен? Как «3E» сообщает микропроцессору обе информации? То есть он должен загружать данные так же, как и целевой регистр. Или дело в том, что весь этот код операции предопределен, и вы не можете разделить «MVI» и «целевой регистр» в коде операции?

Надеюсь, мой вопрос имеет смысл, лол.


person finitenessofinfinity    schedule 10.01.2013    source источник
comment
Кодирование целевого регистра внутри битов инструкции очень распространено. MVI — это 0x00xxx110, где xxx кодирует один из 8 возможных регистров.   -  person Hans Passant    schedule 10.01.2013
comment
Спасибо Ганс! Я понял. :)   -  person finitenessofinfinity    schedule 10.01.2013


Ответы (2)


http://www.pastraiser.com/cpu/i8085/i8085_opcodes.html

Все это 0x3E означает MVI A.

Из таблицы по ссылке выше (при условии, что ей можно доверять)

0x0E MVI C  00001110
0x1E MVI E  00011110
0x2E MVI L  00101110
0x3E MVI A  00111110

0x06 MVI B  00000110
0x16 MVI D  00010110
0x26 MVI H  00100110
0x36 MVI M  00110110

Цветовое кодирование на этой диаграмме дает четкое представление о декодере кода операции: если 2 мсбита равны 00, то если младшие 2 бита равны 10, то если бит 2 равен 1, то это MVI, а биты 3-6 определяют, какой регистр. в основном 0b00rrr110 - это MVI.

person old_timer    schedule 10.01.2013
comment
вы должны были просто собрать mvi a,32h, mvi b,32h и т. д., а затем сравнить машинный код, чтобы увидеть, какие биты изменились. - person old_timer; 10.01.2013
comment
Спасибо, Дуэлч! Я понял. Я по своей дури отчаянно пытался последовательно разделить опкод на две части! - person finitenessofinfinity; 10.01.2013
comment
аналогичным образом, если вы попробовали mvi a, 31, mvi a, 30 и т. д., вы бы увидели, что второй байт полностью меняет/соответствует константе, так что эта часть является не кодом операции, а непосредственной. Таким образом, код операции, если его можно разбить (иногда они не разбиваются на более мелкие части, зависит от набора инструкций), должен быть в этом первом байте. - person old_timer; 10.01.2013

Улучшение ответа, данного здесь. MVI R,d8 загружает предоставленные 8-битные данные (d8) в указанный регистр или память (R). Есть восемь возможных вариантов для R, а именно B, C, D, E, H, L, M и A. Эти восемь возможностей могут быть закодированы тремя битами следующим образом.

name | code
-----|-----
  B  | 000
  C  | 001
  D  | 010
  E  | 011
  H  | 100
  L  | 101
  M  | 110
  A  | 111

MVI R,d8 кодирует имя регистра в 8-битный код операции как 00rrr110, где rrr обозначает 3-битный код регистра, как показано в таблице выше. Таким образом, MVI A,32H приведет к тому, что его первый байт (код операции) будет равен 00 111 110 или 0x3E, а второй байт (данные) будет равен 0x32.

person codeR    schedule 25.06.2021
comment
eeeguide.com/instruction-format-of-8085 содержит еще несколько форматы кода операции - person codeR; 25.06.2021