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.
Связанные: