Инструкция сборки MOV без суффикса - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующая инструкция mov (без суффикса) от дизассемблера.

mov %dx,(%eax)

Каким будет суффикс инструкции?Сначала я подумал, что регистр назначения определяет суффикс, однако, согласно книге, которую я читаю, я предполагаю, что это определяется «самым маленьким» регистром.Таким образом, в этом случае будет

movw %dx, (%eax)

, поскольку% dx (16-битный регистр слов) является наименьшим.Правильно ли мои рассуждения?(Иногда книга CSAPP немного сбивает с толку, не дает четкого объяснения деталей).

1 Ответ

0 голосов
/ 01 октября 2018

Место назначения не является регистром в ваших примерах, это источник, который является регистром.Таким образом, размер операнда 16-битный, поэтому AT & T будет использовать movw.

Адрес назначения составляет 2 байта в памяти, выбранных 32-битным режимом адресации.mov требует, чтобы source и dest были одинаковой ширины.Если хотя бы один операнд является регистром, он однозначно определяет размер операнда.

Вам необходим явный суффикс для чего-то вроде mov $123, (%eax), поскольку ни один из операндов не является регистром.


ВашИдея "наименьшего" является полностью фальшивой.movl %eax, (%bx) равно movl, поскольку операнд регистра равен 32 битам, а 4-байтовое назначение выбирается 16-битным режимом адресации.

Регистр или регистры в режиме адресации не влияют наразмер операнда.Размер адреса и размер операнда независимы, и вы можете переопределить одно, но не другое.(Вот почему существуют отдельные байты префикса машинного кода для размера операнда (0x66) и размера адреса (0x67).

...