Регистр $ 0x1a здесь? - PullRequest
       4

Регистр $ 0x1a здесь?

0 голосов
/ 10 июня 2011
Dump of assembler code for function read@plt:
0x0000000000402458 <read@plt+0>:    jmpq   *0x2b4f72(%rip)        # 0x6b73d0 <_GLOBAL_OFFSET_TABLE_+232>
0x000000000040245e <read@plt+6>:    pushq  $0x1a
0x0000000000402463 <read@plt+11>:   jmpq   0x4022a8

Кто-нибудь знает?

Кстати, откуда read узнает, что он дошел до конца файла?

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Нет, это непосредственное значение.pushq помещает значение в стек, который может быть регистром, но вы обнаружите, что они обозначены операндами, такими как %rbx.

$0x1a являетсяНепосредственное значение - вы можете сказать это также по длине этой инструкции (пять байтов, от x+6 до x+10).Команда pushq может выдавать регистр, содержимое памяти (64 бита) или 32-битное непосредственное значение (знак расширяется до 64 бит).

В этом случае пять байтов являются кодом операции0x68 вместе с 32-битным значением для нажатия.Если бы вы исследовали память, она, вероятно, выглядела бы как 0x68 0x1a 0x00 0x00 0x00.

И не обманывайтесь этим кодом, это вовсе не "настоящий" вызов read.Это заглушка, используемая для исправления ссылок во время выполнения, когда разделы кода могут совместно использоваться процессорами, даже по разным базовым адресам.

PLT - это небольшая заглушка для каждого процесса, которая переходит к реальному общему коду, которыйпервый раз, исправляя себя в процессе, чтобы прыгнуть прямо туда в будущем.См. здесь для объяснения этого процесса.

0 голосов
/ 10 июня 2011

Пока не упоминается, но ведущий знак $ обозначает константу.Это просто при просмотре дампов сборки.

Одна легкая ошибка: при просмотре дампов несвязанных двоичных файлов не обманывайте себя 0x00000000 повсюду.Без начального $ это перемещение компоновщика, а не константа 0.

0 голосов
/ 10 июня 2011

Регистры (обычно) не имеют места в памяти, они являются регистром ЦП.

...