реклама на сайте
подробности

 
 
> почему char занмает 4 байта памяти, Keil, LPC2106
Kail
сообщение Dec 3 2006, 23:28
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 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:
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Dec 4 2006, 00:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Alexey Bishletov
сообщение Dec 4 2006, 09:22
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 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)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 4 2006, 16:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Alexey Bishletov @ Dec 4 2006, 09:22) *
ALIGN=2 это видимо и есть 4, т.е. выравнивание 2 в степени (ALIGN)

Нет, ALIGN задается в байтах, но должен быть степенью 2.
Go to the top of the page
 
+Quote Post
Alexey Bishletov
сообщение Dec 5 2006, 16:32
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 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 как степень для двойки.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 5 2006, 17:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Alexey Bishletov
сообщение Dec 6 2006, 09:13
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 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-а?
Go to the top of the page
 
+Quote Post
Alex03
сообщение Dec 6 2006, 09:39
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Alexey Bishletov @ Dec 6 2006, 11:13) *
Для gcc провожу эксперимент (в документации как-то это туманно отражено или я не то читал)


Цитата
.align abs-expr, abs-expr, abs-expr

Pad the location counter (in the current subsection) to a particular storage boundary. The first expression (which must be absolute) is the alignment required, as described below.

The second expression (also absolute) gives the fill value to be stored in the padding bytes. It (and the comma) may be omitted. If it is omitted, the padding bytes are normally zero. However, on some systems, if the section is marked as containing code and the fill value is omitted, the space is filled with no-op instructions.

The third expression is also absolute, and is also optional. If it is present, it is the maximum number of bytes that should be skipped by this alignment directive. If doing the alignment would require skipping more bytes than the specified maximum, then the alignment is not done at all. You can omit the fill value (the second argument) entirely by simply using two commas after the required alignment; this can be useful if you want the alignment to be filled with no-op instructions when appropriate.

The way the required alignment is specified varies from system to system. For the a29k, arc, hppa, i386 using ELF, i860, iq2000, m68k, m88k, or32, s390, sparc, tic4x, tic80 and xtensa, the first expression is the alignment request in bytes. For example .align 8 advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed. For the tic54x, the first expression is the alignment request in words.

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.

This inconsistency is due to the different behaviors of the various native assemblers for these systems which GAS must emulate. GAS also provides .balign and .p2align directives, described later, which have a consistent behavior across all architectures (but are specific to GAS).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Kail   почему char занмает 4 байта памяти   Dec 3 2006, 23:28
- - beer_warrior   Цитатаchar p[16] - занимает 64 байта памяти. Смотр...   Dec 4 2006, 00:16
|- - 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
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 09:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016