|
почему char занмает 4 байта памяти, Keil, LPC2106 |
|
|
|
Dec 3 2006, 23:28
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 3-08-06
Пользователь №: 19 285

|
компилятор Keil char p[16] - занимает 64 байта памяти. Смотрел в дебагере симулятора. Почему? Куда копать? В сторону aligment?
И еще вопросики про память в догонку. У меня стек в режиме User 0x400, т.е. 1024 байт, а я объявляю int p[1000], т.е. получится 4000 байт и потом в цикле заполняю массив for (i=0;i<1000;i++)p[i]=i; симулятор доходит до p[256] и все, дальше цикл крутится, но элементы не изменяют знвчения. Вопрос, почему не генерируются ошибки доступа к памяти? Еще один вопрос, почему стэк растет вверх? Объявляю int i; и вижу ассемблерный код STMDB R13!,[R14], после его выполнения регистр свяи содержит значение 0x400003fc (при вершине стэка 0x40000400). Почему растет вверх, а не вниз??? UND_Stack_Size EQU 0x00000004 SVC_Stack_Size EQU 0x00000004 ABT_Stack_Size EQU 0x00000004 FIQ_Stack_Size EQU 0x00000004 IRQ_Stack_Size EQU 0x00000080 USR_Stack_Size EQU 0x00000400
AREA STACK, DATA, READWRITE, ALIGN=2 DSB USR_Stack_Size ; Stack for User/System Mode DSB SVC_Stack_Size ; Stack for Supervisor Mode DSB IRQ_Stack_Size ; Stack for Interrupt Mode DSB FIQ_Stack_Size ; Stack for Fast Interrupt Mode DSB ABT_Stack_Size ; Stack for Abort Mode DSB UND_Stack_Size ; Stack for Undefined Mode Top_Stack:
|
|
|
|
|
 |
Ответов
|
Dec 4 2006, 18:24
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 3-08-06
Пользователь №: 19 285

|
Всем спасибо, разобрался. Инициализированная переменная типа char во флэше занимает 1 байт, а в стеке - 4 байта, т.к. выравнивание, а вырвнивание по 4 байта, т.к. регистры 32 битные. Если например будут объевлены 3 переменные char, то они тоже буду занимать 1 ячейку стека, т.е. 3 байта и один будет пустовать. Стэк растет от старших адресов к младшим - так просто приняла ARM, по аналогии с Intel.
|
|
|
|
Сообщений в этой теме
Kail почему char занмает 4 байта памяти Dec 3 2006, 23:28 beer_warrior Цитатаchar p[16] - занимает 64 байта памяти. Смотр... Dec 4 2006, 00:16 aaarrr Цитата(Kail @ Dec 3 2006, 23:28) компилят... Dec 4 2006, 00:21 Alexey Bishletov Цитата(aaarrr @ Dec 4 2006, 00:21) Цитата... Dec 4 2006, 09:22  aaarrr Цитата(Alexey Bishletov @ Dec 4 2006, 09... Dec 4 2006, 16:28   Alexey Bishletov Цитата(aaarrr @ Dec 4 2006, 16:28) Цитата... Dec 5 2006, 16:32    zltigo Цитата(Alexey Bishletov @ Dec 5 2006, 15... Dec 5 2006, 17:03     Alexey Bishletov Цитата(zltigo @ Dec 5 2006, 17:03) Цитата... Dec 6 2006, 09:13      Alex03 Цитата(Alexey Bishletov @ Dec 6 2006, 11... Dec 6 2006, 09:39      zltigo Цитата(Alexey Bishletov @ Dec 6 2006, 08... Dec 6 2006, 11:51       Alexey Bishletov Цитата(zltigo @ Dec 6 2006, 11:51) Цитата... Dec 6 2006, 15:01        zltigo Цитата(Alexey Bishletov @ Dec 6 2006, 14... Dec 6 2006, 17:59         Alexey Bishletov Цитата(zltigo @ Dec 6 2006, 17:59) Да? Чи... Dec 8 2006, 09:33 Kail int main(void)
{
char p[16],i;
for (i=0;i<16... Dec 4 2006, 01:31 aaarrr Цитата(Kail @ Dec 4 2006, 01:31) Что смот... Dec 4 2006, 02:43 sergeeff Во всех С-компиляторах есть sizeof(X) - паказывает... Dec 4 2006, 12:02 boez Вообще в гнутом С для выравнивания придуман атрибу... Dec 7 2006, 12:23 Alex03 Цитата(boez @ Dec 7 2006, 14:23) Вообще в... Dec 7 2006, 14:11 d__ Туфта однозначно. Только что в кейле написал функц... Dec 7 2006, 13:45 boez Да я понимаю что туфта, я ответа спрашивал у товар... Dec 7 2006, 14:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|