Это домашнее задание. Честно говоря, я не уверен, как программа на С доставляет строковый параметр на уровень сборки.
У меня есть функция
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". После этого вы сможете начать работать со строками.