Reputation: 10937
Let's say that I want to read from absolute address gs:$30
in 64bit mode, so the asm code looks something like:
asm
mov rax, gs:[$30]
end;
...and compiler translate this code to...
65 48 8B 05 30 00 00 00 mov rax,gs:[rel $00000030]
But I don't want to use relative address (rip + $30)
. I want the compiler to use absolute address and compile in this way:
65 48 8B 04 25 30 00 00 00 mov rax,gs:[+$0030]
(It is the same, if I use gs:
prefix or not!)
How do I do this?
EDIT:
I know for work-around. I ask if exist any comand to tell compiler to address location as absolute instead relative.
EDIT
So far so good... :)
drhirsch helped me to find the command, and now the compiler translates:
mov rax, gs:[abs qword ptr $30]
or
mov rax, gs:[abs $30]
to this:
6548A13000000000000000 mov rax,[qword $0000000000000030]
Which is almost ok :) Because I want short 32bit opcode (look upper opcodes) instlonger long 64bit opcode.
Is there any way to tell compiler to use short 32 bit address opcode instead long?
Upvotes: 6
Views: 920
Reputation: 30419
You need to use the movabs
instruction.
movabs rax, gs:[$30]
Edit: rip relative addressing is the default mode, on some assemblers you may be able to force 32 bit absolute addressing with
mov rax, gs:[dword $30] #nasm, tasm
mov rax, gs:[abs $30] #yasm
Upvotes: 4