2014-10-24 2 views
7

Мы используем отладчик gdb для чтения функций сборки.Что делает команда jmpq в этом примере

При сборке мы имеем следующие инструкции: mov 0xc(%rsp),%eax jmpq *0x402390(,%rax,8)

В ячейке памяти *0x402390 мы имеем значение 0x8e. В регистре rax у нас есть второй целочисленный ввод для этой конкретной функции (можно использовать переменную y).

Из нашего анализа, мы сделали вывод, что эта функция принимает в трех переменных (x, y, z) и что они могут быть найдены на месте памяти (rsp), (rsp + 8), (rsp + 12) соответственно.

Мы хотели бы знать, что происходит в jmpq *0x402390(,%rax,8). Перепрыгивает ли инструкция до (0x8e + rax*8)? Если да, то как мы можем узнать, что называется этой инструкцией?

Это полный сброс ассемблерного кода для функции phase_3:

Full assembly function

+0

Возможный дубликат [Как работает инструкция jmp в сборке att в этом случае] (http://stackoverflow.com/questions/23418524/how-does-the-jmp-instruction-work-in-att-assembly -в этом случае). См. Также [этот вопрос] (http://stackoverflow.com/questions/26204974/disassembling-why-a-jmp-that-leads-nowhere/26205216) – Jester

ответ

1

Это прыжки в таблицу кода, который имеет 8 байт на запись, вроде оптимизации заявления на включение случая. Это немного запутанно, потому что после jmpq существует серия из 7 байтовых последовательностей, а код, который ветви jmpq (начиная с 402390) не отображается на изображении.

4

От GAS-manual:

Ссылка на непрямое память синтаксиса Intel формы

section:[base + index*scale + disp] 

переводится в синтаксис AT & T

section:disp(base, index, scale) 

, где база и индекс дополнительные 32-разрядные базовые и индексные регистры, disp - это opt смещения и масштаба, принимая значения 1, 2, 4 и 8, умножает индекс для вычисления адреса операнда.

(https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory)

Таким образом, вы можете перевести jmpq *0x402390(,%rax,8) в INTEL-синтаксисом: JMP [RAX * 8 + 0x402390]. Это «косвенный» прыжок. По адресу [RAX * 8 + 0x402390] - адрес, который станет целью jmp. Следующий шаг - определить, сколько адресов можно найти на 0x402390 + x, и в этом случае они используются.