Download project files.
Variables a and b are stored in .rwdata. Variable c is stored on the stack.
int c;
c = sign(a,b);
800224: d1200017 ldw r4,-32768(gp)
800228: d1600117 ldw r5,-32764(gp)
80022c: 08002880 call 800288 <sign>
800230: e0800015 stw r2,0(fp)
Variables a and b are loaded relative to the global pointer register gp. Variable c is stored relative to the frame pointer fp (derived from the stack pointer).
From the symbol table and a dump of .rwdata:
| symbol | address | contents | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| hex | decimal | ||||||||||
_gp| 0x80d948 | a | 0x805948 | 0xe | 14
| b | 0x80594c | 0xfffffff8 | -8
| | ||
Note that gp − &a = 0x80d948 - 0x805948
= 0x8000,
the largest negative number in 16 bits (-32768).
main2.c01: /*
02: * stack and global pointer
03: */
04:
05: #include <stdio.h>
06:
07: int sign(int x, int y);
08: int a = 14;
09: int b = -8;
10:
11: int main()
12: {
13: int c;
14: c = sign(a,b);
15: return 0;
16: }
17:
18: int abs(int a)
19: {
20: return (a<0? -a: a);
21: }
22:
23: int sign(int x, int y)
24: {
25: return (y<0? -abs(x): abs(x));
26: }
27:
00800214 <main>:
int a = 14;
int b = -8;
int main()
{
800214: defffd04 addi sp,sp,-12
800218: dfc00215 stw ra,8(sp)
80021c: df000115 stw fp,4(sp)
800220: d839883a mov fp,sp
int c;
c = sign(a,b);
800224: d1200017 ldw r4,-32768(gp)
800228: d1600117 ldw r5,-32764(gp)
80022c: 08002880 call 800288 <sign>
800230: e0800015 stw r2,0(fp)
return 0;
800234: 0005883a mov r2,zero
}
800238: dfc00217 ldw ra,8(sp)
80023c: df000117 ldw fp,4(sp)
800240: dec00304 addi sp,sp,12
800244: f800283a ret
Maintained by John Loomis, updated Tue Nov 11 22:09:43 2008