2013-07-14 1 views
0

Как я могу получить значение IP зарегистрироваться в моей программе C? например, для получения значений AX и BX регистров у нас есть псевдо переменные _AX and _BX. Есть ли какая-либо псевдо переменная для IP? или есть какой-либо другой метод? Примечание: Мне нужно значение IP, потому что он хранит адрес смещения следующей команды, которая должна быть выполнена?Как получить значение регистра IP?

ответ

3

Вы не можете сделать это на простом C, так как C не имеет понятия регистров процессора. В зависимости от того, какой компилятор вы используете, вам необходимо либо использовать:

  • Собственный компилятор;
  • Внутренняя сборка; или
  • Внешняя сборка рутина

Проверьте документацию вашего компилятора, чтобы увидеть, если есть внутренняя доступны. Предполагая, что их нет, сборка какого-то типа будет вашим единственным вариантом. x86 не имеет инструкции для прямого чтения регистра IP. Вместо этого вам нужно будет использовать что-то вроде инструкции call (которая хранит следующий IP-адрес в стеке), чтобы получить от нее.

Вот один из способов, чтобы получить IP-адрес на x86 (AT & T синтаксис):

.globl get_ip 
get_ip: 
    mov 0(%sp), %ax 
    ret 

Тогда в вас C код, вы можете сделать это:

uint16_t get_ip(); 
... 
uint16_t ip = get_ip(); 

Если ваш компилятор поддерживает встроенный сборки, то вы можете использовать это для записи функции get_ip внутри исходного кода, вместо того, чтобы иметь отдельный исходный файл сборки. Обратитесь к документации вашего компилятора по синтаксису встроенной сборки, если она доступна.

Выше, конечно, предполагается, что вы работаете в 16-разрядной сборке, которую я предполагаю, поскольку вы упомянули регистры AX, BX и IP в своем вопросе. Но если вы хотите, чтобы это работало для 32-битного кода, то, конечно, вам нужно переименовать регистры в %esp, %eax и %eip, а get_eip() затем вернет uint32_t вместо uint16_t.

+0

+1 для приятного ответа – pradipta

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