Я работаю над Computer Systems, A Programmer's Perspective (3-е издание), а практическая задача 3.3 содержит следующую строку:
movb $0xF, (%ebx)
Я должен выяснить, что не так с этой линией сборки x86-64, а ключ ответа гласит: «Невозможно использовать% ebx в качестве регистра адреса», что для меня не имеет смысла. Насколько я понимаю, эта строка намерена скопировать 0xF в место в основной памяти, однако% ebx - это 32-битный регистр, адреса памяти имеют ширину 64 бита на 64-битных машинах, и поэтому% ebx не может содержать адрес памяти, поэтому его нельзя разыменовать (разыменование - это то, что обозначают круглые скобки вокруг% ebx, правильно?). Однако, если заглянуть на несколько страниц назад в книгу (стр. 183, если она у вас есть), можно увидеть пример, детализирующий пять комбинаций операнда mov - назначения, одна из которых:
movb $-17, (%esp) Immediate--Memory, 1 byte
% esp - это 32-битный регистр, как и% ebx! В этом примере показано, как значение байта перемещается в разыменованный 32-битный регистр! Что для меня не имеет смысла, потому что как% esp может содержать 64-битный адрес? Я совсем неправильно понял сборку?
(%esp)
опасен. - person Jester   schedule 26.07.2015