Хранятся ли массивы в обратном порядке в C / C ++?

Я хотел создать массив из 4 элементов в сборке:

; Create an array of 4 elements
push BYTE 'a'
push BYTE 'b'
push BYTE 'c'
push BYTE 'd'

И мне пришло в голову, что массивы хранятся в C / C ++ в обратном порядке (первый элемент имеет наименьший адрес памяти, а последний элемент имеет наибольший адрес памяти), поэтому, чтобы убедиться, что мои предположения верны, я провел следующий тест:

#include <stdio.h>

int main()
{
char arr[4] = {'a', 'b', 'c', 'd'};

printf("Address: %d Value: %c\n", arr + 0, *(arr + 0));
printf("Address: %d Value: %c\n", arr + 1, *(arr + 1));
printf("Address: %d Value: %c\n", arr + 2, *(arr + 2));
printf("Address: %d Value: %c\n", arr + 3, *(arr + 3));

return 0;
}

И результат был, как и ожидалось:

Address: 3603656 Value: a
Address: 3603657 Value: b
Address: 3603658 Value: c
Address: 3603659 Value: d

Значит ли это, что я должен создать массив в Assembly следующим образом:

; Create an array of 4 elements
push BYTE 'd'
push BYTE 'c'
push BYTE 'b'
push BYTE 'a'

И предположим, что первым элементом является адрес «а». Или нет проблемы в том, чтобы сделать это, как раньше, и вместо увеличения на 1, чтобы перейти к следующему элементу, я просто уменьшу на 1?


Редактировать:
Я имел в виду обратный порядок относительно стека (который растет вниз).

1

Решение

Вы не создаете массив здесь. PUSH и POP выполняются для стека, а универсальное правило для стека: Последний вошел Первый вышел.

Если вы хотите создать массив, то вы можете просто использовать серию mov команда:

mov <mem>,<const>  // x86 instruction

или используйте директивы определения данных

Array DW 'a', 'b', 'c', 'd'
0

Другие решения


По вопросам рекламы [email protected]