Eydeet
0
Hallo,
ich bin gerade folgender Compiler-Optimierung begegnet:
Was hier passiert ist eine Signed Multiplication des Parameters ebx durch die (negative) Zahl 0xaaaaaaab. Das Ergebnis wird in edx:eax geschrieben. Der Teil aus edx wird dann zum Parameter addiert (oder eher subtrahiert, edx ist negativ).
Das ist mir so weit klar, aber welcher C-Code wird in diesen Assembler-Code übersetzt?
Eine Google-Suche hat mir verraten, dass eine Unsigned Multiplication mit 0xaaaaaaab einer Division durch Drei entspricht. Vielleicht hilft das weiter...?
ich bin gerade folgender Compiler-Optimierung begegnet:
Code:
[...]
mov ecx,0xaaaaaaab
mov edi,ebx <-- ebx ist eine Zahl zwischen 0 und 31
mov eax,edi
imul ecx
add edi,edx
mov eax,edi
shr eax,0x1f
sar edi,1
add edi,eax
[...]
Was hier passiert ist eine Signed Multiplication des Parameters ebx durch die (negative) Zahl 0xaaaaaaab. Das Ergebnis wird in edx:eax geschrieben. Der Teil aus edx wird dann zum Parameter addiert (oder eher subtrahiert, edx ist negativ).
Das ist mir so weit klar, aber welcher C-Code wird in diesen Assembler-Code übersetzt?
Eine Google-Suche hat mir verraten, dass eine Unsigned Multiplication mit 0xaaaaaaab einer Division durch Drei entspricht. Vielleicht hilft das weiter...?
Zuletzt bearbeitet: