On 11/18/2013 10:57 AM, Andrew Haley wrote:
On 11/18/2013 03:47 AM, Mischa Baars wrote:
On 11/17/2013 11:05 PM, Florian Weimer wrote:
* Mischa Baars:
Please have a look at the following example, and let me know what
you think.
The code doesn't contain any comments, so we don't know what you're
trying to do.
The assembly file does, if you would just look at it.
As you can see, the 'ebx' register is unprotected when the function is
called from a location other than 'main'. Normally I shouldn't be able
to modify the array index from the assembly.
You're doing it wrong. It is the job of the called function to save and
restore %ebx:
%ebx As described below, this register serves as the global offset
table base register for position-independent code. For
absolute code, %ebx serves as a local register and has no
specified role in the function calling sequence. In either
case, a function must preserve the register value for the
caller.
Andrew.
http://www.sco.com/developers/devspecs/abi386-4.pdf
I see what you are pointing at (p.37), but it also says "DRAFT COPY" :)
As you see from the program output, the 'ebx' register IS preserved when
the 'npx_on_double()' function is called from 'main()', but the 'ebx'
registers IS NOT preserved when the 'npx_on_double()' function is called
from another function like 'npx_on_complex()'.
This makes writing low-level functions very sensitive to errors. You
would only notice that your function is in error, when it is called from
other functions than 'main()', which is most likely not the first thing
you do. In my case, that's almost three years later.
Mischa.