2016-11-23 15 views
0

Я столкнулся со следующей инструкцией по сборке and rax, qword ptr [0xff5ff098]Понимание местоположения адреса, обозначенного Qword ptr?

Что я хочу знать, это адрес памяти, к которому будет обращаться следующая инструкция. Будет ли адрес памяти 0xff5ff098 нулевым или будет расширен до самого значительного бита?

В Intel Pin инструмент api IARG_MEMORYREAD_EA прилагает его как удлиненный на 1, т.е. дает следующий адрес 0xffffffffff5ff098. Является ли этот адрес возможным адресом?

Я работаю над 64-разрядной машиной.

+0

Я уверен, что в течение прошлого года возник вопрос о том, были ли 32-битные абсолютные адреса ноль или знак расширенными, но это, вероятно, не является точным дубликатом. Кажется, я вспомнил, что Шут ответил на это. –

ответ

3

Как это кодируется? RIP-относительный или абсолютный?

Если это абсолютное значение, используется режим адресации расширенного-disp32 (потому что 32-bit displacements in addressing modes are always sign extended, даже если нет зарегистрированных регистров).

Если это RIP-родственник, тогда ваш дизассемблер должен показывать правильный конечный адрес, рассчитанный из RIP + rel32.

Либо ваш дизассемблер, либо PIN-код отображают его неправильно, так как если он действительно расшифровывается на 64-битный, ваш дизассемблер должен показывать вам это.


И да, как RIP-относительная, так и абсолютная адресация возможны в x86-64.

x86-32 имел два избыточных способа кодирования [disp32] режимы адресации без регистров. x86-64 переводит более короткий, как RIP-относительный, и оставляет более длинным как абсолютную адресацию [sign-extended-disp32].

Я использую синтаксис NASM для примера. Вы можете использовать default rel использовать RIP-родственницы по умолчанию, и вы можете переназначить на индивидуальной основе случая, как это:

MOV  RAX, [abs FS:_start] ; _start just as something that assembles 
    MOV  RAX, [rel FS:_start] ; RIP-rel for thread-local is usually not useful! 

64 48 8b 04 25 b5 00 40 00 mov rax,QWORD PTR fs:0x4000b5 
64 48 8b 05 e7 fe ff ff  mov rax,QWORD PTR fs:[rip+0xfffffffffffffee7] # 4000b5 <_start> 

Является ли этот адрес возможный адрес?

Да, используются адреса в верхней половине канонического диапазона. например less /proc/self/maps показывает, что Linux отображает vsyscall страницу экспортирующихся в высокое адресном пространство:

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 

Canonical адрес означает, что биты [63:48] являются копиями бит 47. то есть адрес, что вы получите от знака удлинителей низких 48 бит , Неканонические адреса всегда будут сбой на текущем оборудовании, поэтому, если вы хотите реализовать что-то вроде тегов с указанными избыточными битами, вам все равно придется повторить расширение знака до разыменования.


Обратите внимание, что qword ptr говорит вам размер операнда, а не что-нибудь о том, как кодируются режим адресации.