Author: James Robertson
Date: 11:17:35 12/22/98
Go up one level in this thread
On December 22, 1998 at 01:13:34, Eugene Nalimov wrote:
>If you don't access local variables inside your assembly
>block, you can use ebp register. I don't know, will C compiler
>automatically save it before entering assembly block (and
>restore on exit), or not. Make an experiment - use register ebp
>in the assembly block, and look at the resulting code (either
>using "dumpbin /disasm" utility, or in the debugger, or compile
>the module with "/Fa" switch). If there will be no saving/
>restoring of the register around your code, just insert
>"push ebp" on the assembly block entry, and "pop ebp" on exit.
>
>Lack of the registers in x86 have a good side, too - Intel was
>forced to optimize memory accesses. As long as your data
>resides in the L1 cache (and top of the stack is usually
>there), register-memory operations are not slower than
>register-registers (technically speaking they are slightly
>slower, but extra ticks usually are masked by the instruction-
>level parallelism). Avoid only memory-memory operations - e.g.
>"inc 4[ebp]". So, you can either use push/pop pairs, or just
>reload values from memory as you need them. There can be
>slowdown if you use *pointer* soon after loading it into the
>register, so if you have to spill into memory, spill non-
>pointer stuff first - e.g. loop counters.
>
>You can download application note AP-526, "Optimization for
>Intel 32-bit processors" from Intel web site (www.intel.com).
>Also there was an excellent book on that subject - "Inner
>loops". I don't remember the authors, but you can go to
>Amazon.com and find it.
>
>Eugene
>
>On December 21, 1998 at 17:35:26, James Robertson wrote:
>
>>On December 21, 1998 at 15:58:12, Bo Persson wrote:
>>
>>>On December 21, 1998 at 12:16:49, James Robertson wrote:
>>>
>>>>I was recommended to you as someone who is good with x86 register programming.
>>>>
>>>>I am writing a function of my program in assembly, and I have run out of
>>>>registers; I have already used eax, ebx, ecx, edx, esi, and edi; and I need
>>>>one more. Unfortunately, esp, eip generate errors "improper operand type".
>>>>My function looks kinda like this:
>>>>
>>>>MyFunction(MoveList ml)
>>>>{
>>>> __asm
>>>> {
>>>> //and I would like to put:
>>>> mov eip,[ml]
>>>> }
>>>>}
>>>>Compiler: &%^*$ Improper operand type.
>>>>
>>>>I am using VC++ 5.0 under Win95, with a Win32 console program. Please help!
>>>>
>>>>James
>>>
>>>Hi, James!
>>>
>>>Welcome to x86 programming, never enough registers! :-)
>>>
>>> mov eip,[ml]
>>>should be coded as
>>> jmp [ml]
>>>
>>>Seriously, the EIP register points to the next instruction and can not be used
>>>as a general purpose register.
>>>
>>>Depending on the enviromnent you might be able to use the EBP register, but I
>>>think VC++ often uses that for local stack frame reference.
>>>
>>>Try to rearrange your code to save a register or push one on then stack and pop
>>>it later.
>>>
>>>
>>>Bo Persson
>>>bop@malmo.mail.telia.com
>>
>>Darn. No more registers!? How fast is stack pushing and popping? For instance,
>>would
>>
>>mov esi,[ml]
>>....
>>push esi
>>....
>>pop esi
>>....
>>
>>be faster than
>>
>>mov esi,[ml]
>>....
>>mov esi,eax
>>.....
>>mov esi,[ml]
>>
>>?
>>Thanks for you help!
>>
>>James
Thanks; I pushed ebp, and my program's move generation function works 18%
faster.
James
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.