Инструкция по сборке мов
Могу ли я сделать это в сборке mov eax, [ax]
или я должен указать размер mov eax, dword [ax]
,
2 ответа
[ax]
не является допустимым 16-битным режимом адресации. Измените это на mov ebx, [bx]
и ты мог бы сделать это. ebx
определяет размер операции, поэтому вам не нужно будет говорить dword
, В 32-битном режиме [bx]
вряд ли будет "полезным" адресом, но это "допустимый" код. В 32-битном режиме mov al, [eax]
, mov ax, [eax]
а также mov eax, [eax]
все они действительны, а размеры определяются размером регистра назначения, но вы можете сказать "байты", "слова" или "слова" для ясности. В этом (!) Случае размеры не должны совпадать.
Впрочем, в 16-битном коде можно использовать 32-битные инструкции и 32-битные режимы адресации. Весь адрес должен быть в пределах сегмента - обычно 64 Кб - но mov eax, [eax + ecx * 4]
действительный код Nasm (или другой "компетентный" ассемблер) сгенерирует требуемый "префикс переопределения размера операнда" и "префикс переопределения размера адреса" (0x66 и 0x67).
Не бойтесь пробовать эти вещи... хотя может быть неясно, ПОЧЕМУ Нэсм отказывается, и если НЭЗМ ПРИНИМАЕТ это, это не означает, что это сделает то, что вы намерены...
Нет, эти операнды не совпадают. В 32-битной системе, где вы можете получить доступ к EAX, вам также придется использовать тот же размер для адреса.
mov eax, [eax]
заменит указатель в EAX на значение, на которое он указывает.