Evo što je MS VC++ kompajler generirao pod debug buildom za niz tipa __int64, jednostavna dodjela u petlji:
Code:
__int64 x[100];
for ( int i = 0; i < 100; i++ )
x[i] = i;
Dobiješ ovo:
Code:
; 12 : __int64 x[100];
; 13 :
; 14 : for ( int i = 0; i < 100; i++ )
mov DWORD PTR _i$31668[ebp], 0
jmp SHORT $LN3@main
$LN2@main:
mov eax, DWORD PTR _i$31668[ebp]
add eax, 1
mov DWORD PTR _i$31668[ebp], eax
$LN3@main:
cmp DWORD PTR _i$31668[ebp], 100 ; 00000064H
jge SHORT $LN1@main
; 15 : x[i] = i;
mov eax, DWORD PTR _i$31668[ebp]
cdq
mov ecx, DWORD PTR _i$31668[ebp]
mov DWORD PTR _x$[ebp+ecx*8], eax
mov DWORD PTR _x$[ebp+ecx*8+4], edx
jmp SHORT $LN2@main
Obrati pažnju na korištenje
cdq te indeksiranje sa ecx*8.
Nadalje, za množenje u obliku:
Code:
__int64 x[100];
__int64 y[100];
for ( int i = 0; i < 100; i++ )
x[i] = y[i] = i;
for ( int i = 0; i < 100; i++ ) {
x[i] = x[i] * y[i];
je generirao (samo za ovu drugu for petlju):
Code:
; 19 :
; 20 : for ( int i = 0; i < 100; i++ ) {
mov DWORD PTR _i$31673[ebp], 0
jmp SHORT $LN3@main
$LN2@main:
mov eax, DWORD PTR _i$31673[ebp]
add eax, 1
mov DWORD PTR _i$31673[ebp], eax
$LN3@main:
cmp DWORD PTR _i$31673[ebp], 100 ; 00000064H
jge SHORT $LN1@main
; 21 : x[i] = x[i] * y[i];
mov eax, DWORD PTR _i$31673[ebp]
mov ecx, DWORD PTR _i$31673[ebp]
mov edx, DWORD PTR _y$[ebp+ecx*8+4]
push edx
mov ecx, DWORD PTR _y$[ebp+ecx*8]
push ecx
mov edx, DWORD PTR _x$[ebp+eax*8+4]
push edx
mov eax, DWORD PTR _x$[ebp+eax*8]
push eax
call __allmul
mov ecx, DWORD PTR _i$31673[ebp]
mov DWORD PTR _x$[ebp+ecx*8], eax
mov DWORD PTR _x$[ebp+ecx*8+4], edx
jmp SHORT $LN2@main
Očito se sva zabava odvija u fji __allmull(LARGE_INTEGER x, LARGE_INTEGER y), pa sa je disasmao sa IDA-om i nakon sređivanja dobio ovo:
Code:
__allmull proc near ; CODE XREF: j___allmullj
x = _LARGE_INTEGER::$837407842DC9087486FDFA5FEB63B74E ptr 4
y = _LARGE_INTEGER::$837407842DC9087486FDFA5FEB63B74E ptr 0Ch
mov eax, [esp+x.HighPart]
mov ecx, [esp+y.HighPart]
or ecx, eax
mov ecx, [esp+y.LowPart]
jnz short __ima_vise_od_32_bita
mov eax, [esp+x.LowPart]
mul ecx
retn 10h
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
__ima_vise_od_32_bita: ; CODE XREF: __allmull+Ej
push ebx
mul ecx
mov ebx, eax
mov eax, [esp+4+x.LowPart]
mul [esp+4+y.HighPart]
add ebx, eax
mov eax, [esp+4+x.LowPart]
mul ecx
add edx, ebx
pop ebx
retn 10h
__allmull endp
Na sličan način možeš vidjeti i za ostale operacije kakav kod kompajler generira pa ti to može poslužiti kao uzor za pisanje asm koda.