Related articles |
---|
Re: viewing memory stack? sandyATsornDOTnet@nospam.please (Sandy Dunlop) (2002-12-07) |
Re: viewing memory stack? chrisd@reservoir.com (Chris Dodd) (2002-12-11) |
From: | "Sandy Dunlop" <sandyATsornDOTnet@nospam.please> |
Newsgroups: | comp.compilers |
Date: | 7 Dec 2002 20:05:48 -0500 |
Organization: | Compilers Central |
References: | <lyHH9.4255$I91.32549000@news-text.cableinet.net> |
Keywords: | debug, question |
Posted-Date: | 07 Dec 2002 20:05:48 EST |
Sandy Dunlop wrote:
> I have a program I'm debugging and I call a function which returns an
> integer r. The code that calls it assigns this value to a variable:
>
> int myvar;
> ...
> myvar = myfunc();
>
> My problem is that myvar does not get the same value as GDB said r has
> inside myfunc().
I was debugging it on an Athlon MP (with one CPU). Here's some of the ASM
code that GCC 2.96 made, with my comments next to it. I haven't done ASM
for a long time, and have never done it on a real computer, so if I've got
something wrong, please point it out:
eip=0x8054b11
myfunc+
593 mov 0xffffffec(%ebp),%eax * moves return value into register eax
* variables get stored in eax while
* being passed back from functions
596 mov %eax,%eax *
598 leave *
599 ret *
*** at this point register eax contains the return value ***
eip=0x8048dda
caller_func+
222 add $0x10,%esp * increase stack pointer
225 mov %eax,%eax * silly thing that GCC does. EFLAGS=0x382
227 shr $0x1f,%eax * shift right 31 bits. EFLAGS=0x365
* at this point register eax contains zero
* last 16 bits of EFLAGS regiester change to:
* 0000 0011 0101 0110 (0x365)
230 mov %eax,0xffffefd0(%ebp) * Moves the contents of eax onto stack
236 mov 0xffffefd0(%ebp),%eax * Moves top of stack into register eax
242 test %eax,%eax * Corresponds to the if statement in this:
* if (myvar=myfunc()<0){
I think the instruction at caller_func+227 should come after the one at
+230. The shr instruction at +227 removes everything but the bit
representing the sign of the signed integer in eax, so the <0 test can be
made. Why does GCC then think that the new value of eax (zero) should be
pushed onto the stack? It disregards the old value (that was passed back
from myfunc()). Something doesn't seem right here.
FYI, eax contained 90 before the shr instruction.
--
sandy dunlop
www.sandyd.org.uk
Return to the
comp.compilers page.
Search the
comp.compilers archives again.