шаг за шагом
.intel_syntax noprefix
.bits 32
.global asm2
asm2:
push ebp
mov ebp,esp
sub esp,0x10
mov eax,DWORD PTR [ebp+0xc]
mov DWORD PTR [ebp-0x4],eax
mov eax,DWORD PTR [ebp+0x8]
mov DWORD PTR [ebp-0x8],eax
jmp part_b
part_a:
add DWORD PTR [ebp-0x4],0x1
add DWORD PTR [ebp+0x8],0x76
part_b:
cmp DWORD PTR [ebp+0x8],0xa1de
jle part_a
mov eax,DWORD PTR [ebp-0x4]
mov esp,ebp
pop ebp
ret
давайте сначала переименуем параметры вызова в «a», «b», а локальные в «x» и «y»
asm2:
push ebp
mov ebp,esp
sub esp,0x10
mov eax,a
mov x,eax
mov eax,b
mov y,eax
jmp part_b
part_a:
add x,0x1
add b,0x76
итеперь посмотрим, что происходит
asm2:
push ebp
mov ebp,esp ; stack frame
sub esp,0x10 ; make some room for locals
mov eax,a
mov x,eax ; x = a
mov eax,b
mov y,eax ; y = b
jmp part_b ; while (b <= 0xa1de) { // condition see below
part_a:
add x,0x1 ; x++;
add b,0x76 ; b+=76;
part_b:
cmp b,0xa1de ; } // condition for while: (b <= 0xa1de)
jle part_a
mov eax,x ; return x;
mov esp,ebp ; remove stackframe
pop ebp
ret
, поэтому вам нужно знать, какие параметры были, чтобы узнать, что возвращается.для того, что я вижу, это что-то вроде a+(0xa1de-b)/0x76