2010-12-31 4 views
0

Предположим, что у нас есть оператор вызова foo. Поэтому, когда ассемблер встречает заявление вызова он разбивает его -Как найти адрес jmp во время вызова функции x86?

push ip + 6 
jmp <addr of foo> 

У меня есть обратный адрес в регистре EBX. Теперь я хочу узнать «addr foo». Как мне это сделать? Я хочу подтвердить, что оператор push присутствует перед jmp. Будет ли карта памяти выглядеть примерно так?

------- 
push (what will be the value stored in this byte?? opcode ??) 
------- 
jmp (what will be the value stored in this byte?? opcode ??) 
------- 
jmp byte 1 
------- 
jmp byte 2 
------- 
jmp byte 3 
------- 
jmp byte 4 
------- 
return address stored in ebx 
------- 

Каковы операционные коды для push и jmp?

+1

'call' - инструкция, выполняемая процессором. Ассемблер не преобразует его. Вы можете думать, что это эквивалентно «push» и «jmp», но это не одно и то же. – wj32

+0

@ wj32: ok, если вызов выполняется процессором. Как получить адрес места, где он перескакивает? – Bruce

+0

@ wj32: Какова карта памяти оператора вызова? – Bruce

ответ

4

Ассемблер не разбивает call на две инструкции. call - это отдельная инструкция с собственными кодами операций на машинах.

Существуют различные коды операций для call, в зависимости от типа вызова (ближний или дальний адрес, заданный как относительное значение или косвенно в содержимом памяти и т. Д.). Для обычного типа вызова в 32-битном режиме (относительно вблизи вызов), у вас будет код операции E8, за которым следует 4-байтовое значение, указывающее адрес цели относительно следующей команды после call.

Для получения дополнительной информации см запись call в Intel Manual, объем 2.

+0

Не могли бы вы указать мне ссылку, где вы получили код операции для вызова. – Bruce

+0

@Bruce: Я добавил ссылку на стандартную ссылку. – interjay

2

Как @ wj32 говорит в комментарии выше, CALL это одна команда - это не становится «разбита» в PUSH и a JMP. Код операции для CALL может быть E8, 9A или FF в зависимости от того, как указан адрес назначения. См. Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M в разделе 3.2 в разделе «CALL» для получения полной информации о различных кодах операций.

1

Это зависит от типа call. Вы можете получить всю необходимую информацию от Intel manuals. Это включает в себя кодирование команд и т.д. Я процитирую соответствующий немного ниже (для близких вызовов):

Мишень операнд указывает либо абсолютное смещение в сегменте кода ( смещение от основания сегмента кода) или относительное смещение (смещенное смещение к текущему значению указателя инструкции в регистре EIP, это значение указывает на инструкцию, следующую за инструкцией CALL). Регистр CS не , измененный при ближайших вызовах.

0

использовать dissembler, и я думаю, что у вас может получиться абсолютный адрес foo! потому что компоновщик делает это, а скомпилированный код не имеет имен. то же самое для глобальных переменных например, если u собрать u get j foo , но скомпилировать затем dissamble nd ull get j 0X45335

+0

, который вы используете? – Bruce

Смежные вопросы