Добавление указателя массива в ARM - PullRequest
0 голосов
/ 09 октября 2018

Скажем, у нас есть массив X типа (4 байта), а его базовый адрес находится в r0.И у нас есть переменная y в r1 и переменная z в r2.

Если мы сделаем это:

add r1, r0, r1
ldr r2, [r1] 

Что бы это сделало?Я знаю, что это очень просто, но я не понимаю, как будет работать добавление адреса массива и некоторой константы.Также я не понимаю синтаксис ldr r2, [r1].Я знаю, что он загружается в r2, но что такое [r1]?

Это все элементы массива?Так теперь r2 также является базовым адресом массива, который является копией r1?r1 стал массивом, когда он был добавлен к одному?Так добавляется ли оригинал y к каждому элементу массива?Я в основном спрашиваю, как это конвертируется в функцию на C. Сейчас я предполагаю z = g*(B[0] + B[1] + B[2] + B[3]), но я не уверен, что это имеет какой-то смысл.

1 Ответ

0 голосов
/ 09 октября 2018

Это выглядит так:

add r1, r0, r1 /* r1 = r0 + r1 */
ldr r2, [r1]   /* r2 = value at address in r1 */

эти две строки являются трансляцией доступа к массиву x[index].Для вычисления адреса x[index] создается сборочная линия add r1, r0, r1, где r0 - базовый адрес x (адрес x[0]), а r1 - index (умноженное на 4) поэтому r1 наконец содержит x[index] адрес.Затем для извлечения x[index] сборка загружает его из адреса памяти, рассчитанного по строке ldr r2, [r1].

...