Начальное состояние регистров программы и стека на Linux ARM

Мне преподавали путем изучения, как решить проблемы в способе агностика языка использовать блок-схемы и PDL (Язык Проектирования программы). После, пару недель которого, я учился преобразовывать PDL, который я записал в язык. Я рад, что узнал, что путь, потому что я потратил большинство своих лет, программируя, решив проблемы, не будучи связанным с языком. Какой язык, который я использую, всегда был деталью реализации и не частью дизайна.

Необходимость решить проблему путем разрушения его в он - основные шаги, ключевой навык. Я думаю, что это - одна из вещей, которая разделяет тех, которые могут программировать от тех, которые не могут.

До, как Вы занимаетесь порядком понятия языка, которому я верю, самый легкий путь состоит в том, чтобы решить, что это должно иметь проект в виду и заняться понятиями, поскольку они необходимы. Это позволяет Вам применить их, поскольку они необходимы на чем-то, что Вы интересуетесь выполнением. При изучении языка хорошо иметь несколько простых проектов в виду и некоторых с прогрессивной сложностью. Выбор тех поможет Вам планировать понятия, которые необходимы и их порядок.

6
задан unwind 26 November 2009 в 10:15
поделиться

3 ответа

Вот что я использую для запуска программы Linux / ARM с моим компилятором:

/** The initial entry point.
 */
asm(
"       .text\n"
"       .globl  _start\n"
"       .align  2\n"
"_start:\n"
"       sub     lr, lr, lr\n"           // Clear the link register.
"       ldr     r0, [sp]\n"             // Get argc...
"       add     r1, sp, #4\n"           // ... and argv ...
"       add     r2, r1, r0, LSL #2\n"   // ... and compute environ.
"       bl      _estart\n"              // Let's go!
"       b       .\n"                    // Never gets here.
"       .size   _start, .-_start\n"
);

Как вы можете видеть, я просто беру аргументы argc, argv и environment из стека по адресу [ sp].

Небольшое пояснение: указатель стека указывает на допустимую область в памяти процесса. r0, r1, r2 и r3 - первые три параметра вызываемой функции. Я заполняю их значениями argc, argv и environment соответственно.

2
ответ дан 9 December 2019 в 22:36
поделиться

Вот uClibc crt . Кажется, предполагается, что все регистры не определены, за исключением r0 (который содержит указатель на функцию, который должен быть зарегистрирован с помощью atexit () ) и sp , который содержит действительный стек. адрес.

Итак, значение, которое вы видите в r1 , вероятно, не то, на что вы можете положиться.

Некоторые данные помещаются в стек для вас.

3
ответ дан 9 December 2019 в 22:36
поделиться

Я никогда не использовал ARM Linux, но я предлагаю вам либо посмотреть исходный код libcrt, и посмотреть, что они делают или используйте gdb для входа в существующий исполняемый файл. Вам не нужен исходный код, просто пройдитесь по ассемблерному коду.

Все, что вам нужно выяснить, должно происходить в самом первом коде, исполняемом любым двоичным исполняемым файлом.

Надеюсь, это поможет.

Тони

]
0
ответ дан 9 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: