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