Скажи, что я получил
EDX = 0xA28
EAX = 0x0A280105
Я запускаю этот код ASM
IMUL EDX
который, насколько я понимаю, использует только EAX .. если указан один опранд
Так что в коде C это должно быть похоже на
EAX *= EDX;
правильно
После поиска в отладчике .. Я обнаружил, что EDX
тоже изменился.
0x0A280105 * 0xA28 = 0x67264A5AC8
в отладчике
EAX = 264A5AC8
EDX = 00000067
теперь, если вы возьмете ответ 0x67264A5AC8
и разделите первую шестнадцатеричную пару, 0x67 264A5AC8
Вы можете ясно видеть, почему EDX
и EAX
такие, какие они есть.
Хорошо, переполнение происходит ... поскольку оно не может хранить такое огромное число в 32 бита. поэтому он начинает использовать дополнительные 8 бит в EDX
Но у меня вопрос, как бы мне теперь сделать это в коде C, чтобы получить те же результаты?
Полагаю, это будет похоже на
EAX *= EDX;
EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this.