|
почему 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, 00:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Kail @ Dec 3 2006, 23:28)  компилятор Keil char p[16] - занимает 64 байта памяти. Смотрел в дебагере симулятора. Почему? Куда копать? В сторону aligment? Посмотрите лучше, что написано в map-файле. Цитата(Kail @ Dec 3 2006, 23:28)  У меня стек в режиме User 0x400, т.е. 1024 байт, а я объявляю int p[1000], т.е. получится 4000 байт и потом в цикле заполняю массив for (i=0;i<1000;i++)p[i]=i; симулятор доходит до p[256] и все, дальше цикл крутится, но элементы не изменяют знвчения. Вопрос, почему не генерируются ошибки доступа к памяти? А кто, по-вашему, должен сгенерировать ошибку, и почему? Цитата(Kail @ Dec 3 2006, 23:28)  Еще один вопрос, почему стэк растет вверх? Объявляю int i; и вижу ассемблерный код STMDB R13!,[R14], после его выполнения регистр свяи содержит значение 0x400003fc (при вершине стэка 0x40000400). Почему растет вверх, а не вниз??? Ассемблерный код STMDB R13!,[R14] сохраняет в стеке значение LR, и к int i никакого отношения не имеет. И где это стек "растет вверх"??? Цитата(Kail @ Dec 3 2006, 23:28)  AREA STACK, DATA, READWRITE, ALIGN=2 Для стека ALIGN должен быть 4.
|
|
|
|
|
Dec 4 2006, 09:22
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(aaarrr @ Dec 4 2006, 00:21)  Цитата(Kail @ Dec 3 2006, 23:28)  AREA STACK, DATA, READWRITE, ALIGN=2
Для стека ALIGN должен быть 4. ALIGN=2 это видимо и есть 4, т.е. выравнивание 2 в степени (ALIGN)
|
|
|
|
|
Dec 5 2006, 16:32
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(aaarrr @ Dec 4 2006, 16:28)  Цитата(Alexey Bishletov @ Dec 4 2006, 09:22)  ALIGN=2 это видимо и есть 4, т.е. выравнивание 2 в степени (ALIGN)
Нет, ALIGN задается в байтах, но должен быть степенью 2. Я забыл, что речь идет про Keil, т.е. мог и соврать (нет у меня его). Но IAR и gcc 3.ххх воспринимают ALIGN как степень для двойки.
|
|
|
|
|
Dec 5 2006, 17:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Alexey Bishletov @ Dec 5 2006, 15:32)  Но IAR и gcc 3.ххх воспринимают ALIGN как степень для двойки. Никогда никому больше этого не говорите :-). ALIGN должен быть результатом возведения двойки в степень.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 6 2006, 09:13
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(zltigo @ Dec 5 2006, 17:03)  Цитата(Alexey Bishletov @ Dec 5 2006, 15:32)  Но IAR и gcc 3.ххх воспринимают ALIGN как степень для двойки.
Никогда никому больше этого не говорите :-). ALIGN должен быть результатом возведения двойки в степень. Чем он должен быть я не знаю, но как факт: Для IAR читаю в документации (EWARM_AssemblerReference.pdf) Код ALIGN align [,value] ... align Exponent of the value to which the address should be aligned, in the range 0 to 30. For example, align 1 results in word alignment 2 Для gcc провожу эксперимент (в документации как-то это туманно отражено или я не то читал) Код .section .text2, "ax" .code 32 .align 2 lbl1: mov r0, #0x01
section .text2 00000000 <lbl1>: 00000000 E3A00001 mov r0, #0x1 Код .section .text2, "ax" .code 32 .align 4 lbl1: mov r0, #0x01
section .text2 00000000 <lbl1>: 00000000 E3A00001 mov r0, #0x1 00000004 E1A00000 nop 00000008 E1A00000 nop 0000000C E1A00000 nop Так как же у Keil-а?
|
|
|
|
|
Dec 6 2006, 15:01
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(zltigo @ Dec 6 2006, 11:51)  Цитата(Alexey Bishletov @ Dec 6 2006, 08:13)  Чем он должен быть я не знаю, но как факт: Для IAR читаю в документации (EWARM_AssemblerReference.pdf)
Прочитайте еще первый пост. Речь идет о "C" для ARM платформы после чего почитайте чего там пишут в CRefrence. Речь идет не о "С" а о startup.s для С, написаном на ASM. Собственно в самом С директива ALIGN не применима. Зачем читать CRefference? Цитата(Alex03 @ Dec 6 2006, 09:39)  Цитата .align abs-expr, abs-expr, abs-expr ... For other systems, including the i386 using a.out format, and the arm and strongarm, it is the number of low-order zero bits the location counter must have after advancement. For example .align 3 advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed.
Спасибо за подтверждение моего эксперимента, в той документации для gcc, что идет вместе CrossStudio этой фразы я не видел.
|
|
|
|
|
Dec 6 2006, 17:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Alexey Bishletov @ Dec 6 2006, 14:01)  Речь идет не о "С" а о startup.s для С, написаном на ASM. Да? Читаем: Цитата компилятор Keil char p[16] - занимает 64 байта памяти. Смотрел в дебагере симулятора. Почему? Куда копать? В сторону aligment? Цитата Собственно в самом С директива ALIGN не применима. Зачем читать CRefference? Для понимания того, что прагмы управления alignment применяются "в самом С" и следует его почитать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Kail почему char занмает 4 байта памяти Dec 3 2006, 23:28 beer_warrior Цитатаchar p[16] - занимает 64 байта памяти. Смотр... Dec 4 2006, 00:16      Alex03 Цитата(Alexey Bishletov @ Dec 6 2006, 11... Dec 6 2006, 09:39         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 Kail Всем спасибо, разобрался. Инициализированная перем... Dec 4 2006, 18:24 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
|
|
|