Asterisk Pointer in Assembly (I32 / x86)

assembly, att, gdb, pointers, x86

Solution

That instruction is an indirect jump. This means that the memory address specified is not the jump target, but a pointer to the jump target.

First, the instruction loads the value at the memory address:

*0x804a400(,%eax,4)

which is more sensibly written as:

0x804a400 + %eax * 4  // %eax can be negative

And then set the %eip to that value.

The best way to decipher these is to use the Intel Programmer's Reference manual. Table 2-2 in Volume 2A provides a break down the ModR/M byte and in this case the SIB byte also.

Problem

The offending line: ``` 8048f70: ff 24 85 00 a4 04 08 jmp *0x804a400(,%eax,4) ``` There is no instruction in the disassembled code at location 804a400 (my list ends at 804a247) When I check to see what's at that memory location I get: ``` (gdb) x/c 0x804a40c 0x804a40c: -103 '\231' (gdb) x/t 0x804a40c 0x804a40c: 10011001 (gdb) x/s 0x804a40c 0x804a40c: "\231\217\004\b\222\217\004\b\211\217\004\b\202\217\004\bw\217\004\b\002" (gdb) x/3x 0x804a40c 0x804a40c: 0x99 0x8f 0x04 ``` What exactly is this jmp statement trying to do?

Original source