Electronics > Beginners
C learning
andri:
--- Quote ---But a person who has used ASM would definitely know that it can be optimized...
--- Code: ---int a, c;
a=450;
c= a>>5;
--- End code ---
--- End quote ---
This is not really about knowing assembly, rather about general base-2 calculations.
In fact, any decent C compiler will happily do it for you. Example: I compiled with gcc 4.1.2 (with flags -m32 -march=i386 for simplicity) the following function:
--- Code: ---int divide (unsigned int a) {
unsigned int b = 32;
return a / b;
}
--- End code ---
(I had to move it into a function, otherwise the compiler optimized the whole division away.)
With -O0 optimizations (everything turned off) it indeed compiles into rather dumb division:
--- Code: ---divide:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $32, -4(%ebp)
movl 8(%ebp), %eax
movl $0, %edx
divl -4(%ebp)
leave
ret
--- End code ---
However, even with -O1 it does the optimization for us:
--- Code: ---divide:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
shrl $5, %eax
leave
ret
--- End code ---
(Quick guide to i386 assembly: "shrl" is logical shift right, "divl" is unsigned division).
migsantiago:
--- Quote from: andri on September 17, 2010, 01:45:32 am ---This is not really about knowing assembly, rather about general base-2 calculations.
--- End quote ---
Yeah, I was just looking for a simple example. Sorry. :P
joelby:
--- Quote from: migsantiago on September 17, 2010, 01:54:10 am ---Yeah, I was just looking for a simple example. Sorry. :P
--- End quote ---
Well, one that applies to the MSP430 - the processor has instructions that handle BCD numbers, but there's no standard way to represent these in C so the compiler isn't able to recognise that these instructions could be used. The solution is pretty easy - use the inline assembly code examples that TI helpfully provide.
Navigation
[0] Message Index
[*] Previous page
Go to full version