Копирование 16 бит в ячейку памяти - PullRequest
1 голос
/ 15 октября 2019

Я сейчас учусь в классе машиностроения в колледже, и мы начинаем изучать сборку. У нас есть вопрос, который говорит:

Следующая инструкция сборки x86-64 скопирует 16 бит из регистра A в область основной памяти, указанную регистром B.

Мой лабораторный партнер думает, что ответ movw %ax, (%rbx). Потому что место, куда мы копируем это указатель.

Я думаю, что это: movw %ax, (%bx) Потому что это означает, что это 16 бит.

Любое объяснение поможет, потому что мы потерялись, и нет тонны явной информации об этом!

1 Ответ

0 голосов
/ 15 октября 2019

16-битный размер адреса не может использоваться в 64-битном коде. Указатели 64-битные . Вы могли бы попытаться собрать movw %ax, (%bx), хотя полученное сообщение об ошибке foo.s:1: Error: `(%bx)' is not a valid base/index expression не является супер-полезным. (Я использовал gcc -c foo.s для запуска GAS на нем на моем рабочем столе Linux x86-64.)

Размер адреса и размер операнда - это разные вещи.

mov %ax, (%rbx) - это 16-битное хранилище для памяти, на которую указывает RBX. %ax - это 16-битный регистр, поэтому он подразумевает размер 16-битного операнда. (И да, movw с суффиксом переопределения размера операнда на мнемонике также является допустимым способом его записи.)


Интересный факт: mov %ax, (%ebx) кодируется в 64-битном режиме,но он будет использовать только младшие 32 бита RBX в качестве адреса для операнда памяти. По сути, вы никогда не хотите использовать 32-битный размер адреса в 64-битном режиме, даже в инструкции LEA.

Ваш лабораторный партнер верен, он в точности аналогичен C:

  uint16_t *p;
  sizeof(p) == 8        // With a normal x86-64 C compiler
  sizeof(*p) == 2

Вы всегда должны использовать полный размер регистра в режимах адресации. Использование младших 16 битов указателя в качестве режима адресации было бы бесполезным.

Там нет тонны явной информации об этом!

Руководства Intel оченьявный, но тоже довольно длинный. https://software.intel.com/en-us/articles/intel-sdm#three-volume

HTML-фрагмент основной части руководства по vol.2 (без части «как читать»): https://www.felixcloutier.com/x86/index.html, с записью для mov, равной https://www.felixcloutier.com/x86/mov

См. Также другие ссылки на https://stackoverflow.com/tags/x86/info.

Связанные:

...