내가이 ASM 코드조립
IMUL EDX
을 실행
EAX = 0x0A280105
EDX = 0xA28
그래서 C 코드는
EAX *= EDX;
올바른
처럼해야 하는가?디버거를보고 나서 .. EDX
도 변경되었습니다. EDX
및 EAX
길을 왜 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.
이 명령어는 결과를 32 비트 손실없이 표현할 수 있는지 여부에 관계없이 제품 값에 관계없이 항상 제품을 저장하는 데 EDX를 사용합니다. –