### Author Topic: Can somebody explain me this code?  (Read 2976 times)

#### nobody

• Guest
##### Can somebody explain me this code?
« on: April 11, 2009, 03:51:09 PM »
Hello

I wrote this C function:

int F(int a, int b) {
return a+b*25;
}

Borland C and GCC outputs for the code above the following assembly code:

push      ebp
mov       ebp,esp

mov       eax,dword ptr [ebp+12]
lea       eax,dword ptr [eax+4*eax]
lea       eax,dword ptr [eax+4*eax]

pop       ebp
ret

the function works perfectly, but how does the compiler manages to multiply B by 25 using LEA??

thanks

#### Frank Kotler

• NASM Developer
• Hero Member
• Posts: 2481
• Country:
##### Re: Can somebody explain me this code?
« Reply #1 on: April 11, 2009, 04:42:19 PM »
As you see! Pretty clever. these compilers. eh?

Here's another one (also stolen from a compiler). You know how to convert ascii text to integer, right? Multiply "result so far" by ten, and add in the digit (after converting ascii character to number)...

atoi:
mov edx, [esp + 4]  ; pointer to string
xor eax, eax        ; clear "result"
.top:
movzx ecx, byte [edx]
inc edx
cmp ecx, byte '0'
jb .done
cmp ecx, byte '9'
ja .done

; we have a valid character - multiply
; result-so-far by 10, subtract '0'
; from the character to convert it to
; a number, and add it to result.

lea eax, [eax + eax * 4]
lea eax, [eax * 2 + ecx - 48]

jmp short .top
.done
ret
;--------

(gawd, I hope that's more readable when it unwraps!)

lea "looks" like a "memory function", but it doesn't touch memory at all - it's really an "arithmetic function". Can't do arbitrary arithmetic with it, of course, but anything that has the form of a valid effective address can be calculated with lea.

Might be interesting to experiment and see just *how* clever the compiler is at this!

Best,
Frank