Non capisco cosa sta succedendo in questo codice. Il codice C è:Comprensione delle ottimizzazioni del compilatore C++ MSVS
#include <stdio.h>
int main()
{
const int mul = 100;
int x;
printf_s("Input a number\r\n");
scanf_s("%i", &x);
printf_s("%i/%i = %i\r\n", x, mul, x/mul);
return 0;
}
Mi aspettavo che l'assembly risultante saranno alcuni cambiamenti semplici e aggiungere/operazioni di sub, ma ci sono alcune costanti magici come 51EB851Fh
, moltiplicazioni, ecc Che cosa sta succedendo qui?
; int __cdecl main()
_main proc near
x= dword ptr -8
var_4= dword ptr -4
push ebp
mov ebp, esp
sub esp, 8
mov eax, ___security_cookie
xor eax, ebp
mov [ebp+var_4], eax
push offset Format ; "Input a number\r\n"
call ds:__imp__printf_s
lea eax, [ebp+x]
push eax
push offset aI ; "%i"
call ds:__imp__scanf_s
mov ecx, [ebp+x]
mov eax, 51EB851Fh
imul ecx
sar edx, 5
mov eax, edx
shr eax, 1Fh
add eax, edx
push eax
push 64h
push ecx
push offset aIII ; "%i/%i = %i\r\n"
call ds:__imp__printf_s
mov ecx, [ebp+var_4]
add esp, 1Ch
xor ecx, ebp ; cookie
xor eax, eax
call @[email protected] ; __security_check_cookie(x)
mov esp, ebp
pop ebp
retn
_main endp
Come hai ottenuto l'assemblaggio risultante? –
ida, ma puoi usare qualsiasi utilità gratuita di google usando la frase segreta 'free disassembler' –