инструкция по сборке imul-один операнд?
Я использую отладчик времени выполнения.
EAX: 0000 0023 EDX: 5555 5556
imul edx
EAX: aaaa aac2 EDX: 0000 000b
Я совершенно запутался и не могу понять, как работает это умножение. Что здесь происходит? Я замечаю в подобном вопрос это imul ebx ; result in EDX:EAX Я не понимаю обозначения EDX:EAX, хотя:/
1 ответов
когда форма одного операнда imul передается 32-битный аргумент (как в вашем случае с EDX) это фактически означает EAX * EDX когда как EAX и EDX являются 32-битными регистрами.
произведение двух 32-битных значений не обязательно вписывается в 32 бита: полный результат умножения может занимать до 64 бит. Высокие 32 бита ответа будут записаны в EDX register и низкие 32 бита к EAX регистрация; это представлено с EDX:EAX нотация.
если вы хотите только низкие 32 бита результата, используйте форму 2-операнда imul; Он работает быстрее и не имеет неявных операндов (поэтому вы можете использовать любые регистры, которые наиболее удобны).
imul ecx, esi тут ecx *= esi как и следовало ожидать, не касаясь EAX или EDX. Это как C, где unsigned x=...; x *= y; имеет ту же ширину для результата, что и входы.
imul также имеет непосредственную форму:imul ecx, ebx, 1234 тут ecx = ebx * 1234. Многие ассемблеры примут imul ecx, 1234 как короткая рука для imul ecx, ecx, 1234.
эти 32x32 => 32-разрядные формы imul корректная работа для подписанного или неподписанного; результаты одного операнда mul и imul отличаются только в верхней половине (в EDX), а не низкое-половина EAX выход.
посмотреть руководство по эксплуатации Intel дляimul.