Frage

What would be the proper gcc compilable GAS ASM code to store my constant $3360220 in a memory location 0x7FFFFFFFb098? Will this produce the desired result? Is it ok that the movabs instruction "spills" on the next line? added question: my disassembled code looks like this eventhough i wrote

jmp 0x401070

, why is that and how do i fix it? it also converted my movq to movabs

   0:   49 c7 c1 dc 45 33 00    mov    $0x3345dc,%r9
   7:   49 ba 98 f0 ff ff ff    movabs $0x7fffffff098,%r10
   e:   07 00 00 
  11:   4d 89 0a                mov    %r9,(%r10)
  14:   e9 00 00 00 00          jmpq   0x19

I made the .d file in linux x86-64 using objdump -d file.o > file.d. How do I use the proper linking?

I mistyped the address at first missing the "b" in the hex.Sorry for that.

War es hilfreich?

Lösung 2

I solved my problem pushing the address on the stack and returning.

0000000000000000 <.text>:
   0:   49 c7 c1 dc 45 33 00    mov    $0x3345dc,%r9
   7:   4c 8d 54 24 08          lea    0x8(%rsp),%r10
   c:   4d 89 0a                mov    %r9,(%r10)
   f:   ff 34 25 70 10 40 00    pushq  0x401070
  16:   c3                      retq 

The problem was that one cannot easily specify a 64bit address in a jmp instruction. The assembler does not know where is this code going to be, it sets aside 32-bits for a near jump and adds a relocation section that tells the linker to update this region with the correct data.

Andere Tipps

To store constant $3360220 in memory location 0x7FFFFFFF098, you want something like:

mov $3360220, %rax
movabs %rax, 0x7fffffff098

You're

jmp 0x401070

looks like:

14:   e9 00 00 00 00          jmpq   0x19

because you disassembled the .o file. If you disassemble it after the linker is done with relocation processing, it'll look normal:

0x00000000004000e5 <+17>:   e9 86 0f 00 00  jmpq   0x401070
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top