Место назначения не является регистром в ваших примерах, это источник, который является регистром.Таким образом, размер операнда 16-битный, поэтому AT & T будет использовать movw
.
Адрес назначения составляет 2 байта в памяти, выбранных 32-битным режимом адресации.mov
требует, чтобы source и dest были одинаковой ширины.Если хотя бы один операнд является регистром, он однозначно определяет размер операнда.
Вам необходим явный суффикс для чего-то вроде mov $123, (%eax)
, поскольку ни один из операндов не является регистром.
ВашИдея "наименьшего" является полностью фальшивой.movl %eax, (%bx)
равно movl
, поскольку операнд регистра равен 32 битам, а 4-байтовое назначение выбирается 16-битным режимом адресации.
Регистр или регистры в режиме адресации не влияют наразмер операнда.Размер адреса и размер операнда независимы, и вы можете переопределить одно, но не другое.(Вот почему существуют отдельные байты префикса машинного кода для размера операнда (0x66
) и размера адреса (0x67
).