2014-12-20 3 views
2

Я читал о виртуальных машинах для языков, таких как C#, Java и т. Д., И я не могу понять одну из деталей, как процессор знает, сколько данных нужно писать. Предположим следующий синтаксис:Хранить переменную с определенной длиной в памяти

mov [A], 'A'; 

A - это виртуальный регистр, а «A» - только знак длины 8 бит. [A] означает, что в регистре есть адрес, в котором в памяти будет сохранена наша переменная. Предположим, что наш регистр имеет длину 32 бит. Как процессор узнает, что нам нужно только сохранить в памяти первый 1 байт, а другие 3 не имеют значения? Мы не можем просто загружать в память полные 32 бита, потому что мы что-то переоценили.

Единственная идея, которую я мог себе представить, - создать инструкции, специализированные инструкции, такие как mov byte, move word и т. Д. ... но я думаю, что это не лучшее решение.

Мой вопрос не является «специфичным для процессора», я хотел бы знать, что общего правила.

+0

Размер операции действительно закодирован в инструкции. Синтаксис зависит от архитектуры, это может быть другая мнемоника или какой-то модификатор/суффикс или оператор. – Jester

+1

Что вы подразумеваете под "others 3"? Размер регистра 'A' ​​не имеет ничего общего с его * содержимым * или с семантикой операции перемещения. Как вы сами сказали: '[A]' означает 'использовать память, адрес которой хранится в 'A'. –

+0

Другие 3 означает, что мы поместили в регистр, например, char и другие биты из наших первых 8 бит для нас неактуальны и не должны храниться в памяти. @Jester - вы бы представили простой пример? – Puchacz

ответ

1

Размер операции действительно закодирован в инструкции. Синтаксис зависит от архитектуры, это может быть другая мнемоника или какой-то модификатор/суффикс или оператор.

Некоторые примеры:

  • x86 Intel синтаксис: mov byte ptr [x], y против mov dword ptr [x], y
  • x86 на & т Синтаксис: movb $y, x против movl $y, x
  • MIPS: sb $t0, ($t1) против sw $t0, ($t1)
  • СПАРК: stb %g0, [%o0] против st %g0, [%o0]
  • рычаг: strb r0, [r1] против str r0, [r1]
  • 68k: move.b #0, (A0) против move.l #0, (A0)
Смежные вопросы