Как работать со строками в ARM? - PullRequest
4 голосов
/ 20 июня 2010

Это домашнее задание. Честно говоря, я не уверен, как программа на С доставляет строковый параметр на уровень сборки.

У меня есть функция

StringSearchInString( text, searchString);

и параметры

text = "Hallo Alles klar"

searchString = "ll"

Я знаю, что ARM доставляет параметры в регистр R0, R1 соответственно для text, searchString, но я не уверен, как это работает с символами. Если каждый символ имеет длину 8 битов, то регистр безжалостно уничтожается входящей строкой.

С тех пор я прочитал, что ARM APCS преобразует аргументы в слова, из которых первые 4 байта сохраняются в регистре, а остальные загружаются в обратном порядке в стеке.

ооочень ... что? Я не понимаю этого. Строка text будет храниться в R0, первые четыре байта, «Холл» хранятся в R0, а остальные в обратном порядке в стеке? Я правильно понимаю? Как мне их назвать?

TL; DR: как передать строковый аргумент из C-программы в сборку и как с ним работать / загружать / делать что-то?

ОТВЕТ:

В отдаленном случае, когда кто-нибудь ищет решение этой проблемы, вот оно:

Как сказал Грег Хьюгилл, строки передаются как указатель на строку. Следовательно, значение в R0 является адресом строки. Поэтому вы используете косвенную адресацию для доступа к значению следующим образом:

StringSearchInString( text, searchString ); // calls the ARM function...

//Going into the ARM function...

LDRB R4, [R0], #1 // Load the first value of R0 into R4 and skip 
                  // ahead one character(8 bits)
                  // Note the "B" in LDR. It indicates that you load ONLY 1 byte!
MOV R0, R4        // Move the value of R4 into R0. This destroys the pointer
                  // Stored in R0! Careful!

И удачи! Если ваша строка "hallo Alles klar", как моя, у вас будет 0x68, загруженный в регистр R0. Это значение ASCII "h". После этого вы сможете начать работать со строками.

Ответы [ 2 ]

5 голосов
/ 20 июня 2010

Краткий ответ: строки C передаются в виде указателя на символьные данные где-то еще.Например, R0 может содержать значение 0x01000078, которое будет интерпретироваться как указатель на данные "Hallo Alles klar" в памяти, за которым следует нулевой символ (00 байт). Это не является уникальным для ARM.

0 голосов
/ 02 апреля 2019

На самом деле он не хранится в «обратном» порядке, он просто регистрирует байты хранилища в формате с прямым порядком байтов, а стек, который является памятью, сохраняет байты с прямым порядком байтов. Не путайте регистры с памятью. Что касается фактического порядка стека, то он может быть как нисходящим, так и восходящим в зависимости от того, как вы кодируете свой пуш. С ARM вы можете адаптировать свой стековый фрейм к росту или уменьшению.

...