инструкция по сборке 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.