조립

2011-10-13 3 views
1

내가이 ASM 코드조립

IMUL EDX

을 실행

EAX = 0x0A280105

EDX = 0xA28

을 가지고 말하는 내 이해 EAX .. 사용하는 경우에만 하나의 oprand 지정

그래서 C 코드는

EAX *= EDX;

올바른

처럼해야 하는가?

디버거를보고 나서 .. EDX도 변경되었습니다. EDXEAX 길을 왜 0x67 264A5AC8 당신이 명확하게 볼 수 있습니다

지금은 대답 0x67264A5AC8을 먼저 진수 쌍을 분할하는 경우 EAX = 264A5AC8 EDX = 00000067

, 디버거에서

0x0A280105 * 0xA28 = 0x67264A5AC8

그들은.

오케이 이렇게 32 비트에 이러한 거대한 숫자를 저장할 수 없으므로 오버플로가 발생합니다. 그래서 EDX에서 여분의 8 비트를 사용하기 시작합니다

하지만 제 질문은 어떻게 지금 C 코드에서 동일한 결과를 얻으려고할까요?

것은 내가 (대상을 지정할 수있는 새로운 버전 중 하나를 사용하지 않는)을 IMUL 명령이 실제로 두 피연산자의 크기를 결과를 생성

EAX *= EDX; 
EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this. 
+1

이 명령어는 결과를 32 비트 손실없이 표현할 수 있는지 여부에 관계없이 제품 값에 관계없이 항상 제품을 저장하는 데 EDX를 사용합니다. –

답변

1

처럼 될 것 같은데요. 그래서 :

imul 8bit -> result = ax, 16bits 
imul 16bit -> result = dx:ax, 32bits 
imul 32bit -> result = edx:eax, 64bits 

는 컴파일러에 의존 될 것입니다 C에서이 작업을 수행하려면,하지만 일부는 이렇게 작동합니다

long result = (long) eax * (long) edx; 
eax = result & 0xffffffff; 
edx = result >> 32; 

이 긴 64 비트입니다 가정합니다. 컴파일러에 64 비트 데이터 유형이 없으면 결과를 계산하는 것이 훨씬 어려워지고, 긴 곱셈을 수행해야합니다.

항상 imul 명령을 인라인 할 수 있습니다.

+0

imul 명령을 인라인 할 수 없습니다. 실제로 ASM을 C 코드로 에뮬레이트하려고합니다. 그러면 레지스터가 나를 생성합니다. 'CALL EAX ''이이 런타임 코드를 얻기 위해이 도구를 빌드하는 유일한 이유입니다. 실제로 프로그램을 실행하지 않고 – SSpoke