2010-04-27 1 views
3

У меня есть проект Windows Mobile 6 ARMV4I, где я хотел бы получить значение счетчика программ.Получение значения ПК в ARM-сборке

функция объявлена ​​так:

extern "C" unsigned __int32 GetPC(); 

Моя сборка код выглядит следующим образом:

GetPC FUNCTION 
    EXPORT GetPC 
    ldr r0, [r15] ; load the PC value in to r0 
    mov pc, lr  ; return the value of r0 
ENDFUNC 

Но, когда я вызываю функцию GetPC(), я получаю такое же число каждый раз. Итак, я предполагаю, что мое собрание не делает то, что я думаю, что это делает. Может ли кто-нибудь указать, что я могу делать неправильно?

Спасибо, PaulH

ответ

7

PC это же каждый раз, потому что ldr r0, [r15] имеет фиксированный адрес (PC всегда же есть). используйте R14, потому что он содержит обратный адрес, который может быть тем, что вам нужно. или использовать встроенные функции.

+0

Предполагая, что он использует инструменты Microsoft, встроенный ARM ассемблере не поддерживается. – ctacke

+0

Это мой первый набег на сборку, поэтому я, вероятно, недопонимаю вас. Но R15 - это счетчик программ, а R0 - возвращаемое значение в соответствии с http://www.pentest.co.uk/documents/exploringwce/exploring_wce_shellcode.html#N10081. Вы говорите, что сайт ошибочен, и это на самом деле R14? Спасибо – PaulH

+0

@ctacke - Да, я использую VS2008, а встроенные команды '__arm' не поддерживаются. – PaulH

4

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

Вы, вероятно, хотите:

move r0, lr // put return address in r0 
move pc, lr // return 

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

  • Нет связанных вопросов^_^