Я хотел создать массив из 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?
Редактировать:
Я имел в виду обратный порядок относительно стека (который растет вниз).
Вы не создаете массив здесь. PUSH и POP выполняются для стека, а универсальное правило для стека: Последний вошел Первый вышел.
Если вы хотите создать массив, то вы можете просто использовать серию mov
команда:
mov <mem>,<const> // x86 instruction
или используйте директивы определения данных
Array DW 'a', 'b', 'c', 'd'