2014-08-28 2 views
0

я имею следующие сборочные линии:операции МУЛА в сборке

... 
MOV ECX, 0x36EE80 
MOV EDX, 0x95217CB1 
MUL EDX 
SHR EDX, 0x15 
MOV DWORD PTR SS:[EBP-0x3C8], EDX 
.... 
.... 

Так, в http://en.wikibooks.org/wiki/X86_Assembly/Arithmetic Я прочитал, что значение операнда MUL (в этом случае EDX) умножаются на значении в EAX. Итак, в EAX у меня значение 0330FD3B (десятичное: 53542203). В EDX у меня есть значение 95217CB1 (в десятичной системе: 2501999793). Но после операции MUL у меня в EDX значение 01DBEE41 (в десятичной системе: 31190593). Но это должно быть неправильно, потому что 53542203 * 2501999793 не 31190593 ...

Может кто-нибудь объяснить мне это?

+1

Если это касается сборки x86, вы должны пометить ее как таковой. – lurker

+2

Когда вы умножаете EDX на EAX, результат получается в 'EDX: EAX'. '0330FD3B' *' 95217CB1' является '1DBEE41EB22A9CB', поэтому' EDX' будет '1DBEE41', а EAX будет« EB22A9CB », образуя весь ответ. – lurker

+2

Прочтите ссылку, которую вы разместили более тщательно, OP :) –

ответ

6

The description для MUL r/m32 является Unsigned multiply (EDX:EAX <- EAX * r/m32)..

Это означает, что 64-битные продукт будет храниться в EDX:EAX, то есть верхний 32 бит заканчивается в EDX, а нижний 32 бит в EAX. Что соответствует результатам, которые вы видите, так как продукт должен быть 0x1DBEE41EB22A9CB.

4

Результат 01DBEE41 EB22A9CB, EDX хранит высокую его часть.
Десятичные числа не являются конкатенабельными при работе с двоичным представлением чисел.