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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> почему char занмает 4 байта памяти, Keil, LPC2106
zltigo
сообщение Dec 6 2006, 17:59
Сообщение #16


Гуру
******

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


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

Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868



Вообще в гнутом С для выравнивания придуман атрибут, и там таких приколов (биты или байты) нету.

aligned (alignment)
This attribute specifies a minimum alignment (in bytes) for variables of the specified type.

Или щас в кейле компилятор не гнутый?

А вообще вот вы мне объясните, кто понимает - ведь массив это _единая_ переменная. Да, ее размер тоже обязан быть кратным выравниванию, в данном случае 4 (тоже кстати вопрос - а с какой радости по умолчанию байты ровняются по 4). Но он и так будет, 16 кратно 4. А тут я так понимаю компилер раскладывает байты с трехбайтными дырками? А если мне это пакет пришел и я его разобрать хочу? Как это оно вообще так получается?
Go to the top of the page
 
+Quote Post
d__
сообщение Dec 7 2006, 13:45
Сообщение #18


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

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Туфта однозначно. Только что в кейле написал функцийку:
int main()
{
char xxx[64] = "1234567890";
int i;
for(i=0;i<63;i++)xxx[i]=~xxx[i];

}
Прогнал на симуляторе, вот фрагмент окна памяти:
0x0401052C BC 05 01 04 00 00 00 00 - BC 05 01 04 00 00 00 00 ................
0x0401053C 17 43 00 01 00 00 00 00 - 1B 36 00 01 00 00 00 00 .C.......6......
0x0401054C A0 4D 00 01 88 00 00 04 - 00 00 00 00 00 00 00 00 .M..............
0x0401055C 00 00 00 00 00 00 00 00 - 10 00 00 00 68 57 00 01 ............hW..
0x0401056C 00 00 00 00 88 00 00 04 - AC 02 00 01 00 00 00 00 ................
0x0401057C 31 32 33 34 35 36 37 38 - 39 30 00 00 00 00 00 00 1234567890......
0x0401058C 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0x0401059C 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
Не надо ниспровергать основы...
Автоматическая переменная, располагается на стеке по адресу 0х0401057с.
С дружеским приветом.
Учите матчасть...
Go to the top of the page
 
+Quote Post
boez
сообщение Dec 7 2006, 14:06
Сообщение #19


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

Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868



Да я понимаю что туфта, я ответа спрашивал у товарищей, которые тут авторитетно про выравнивание рассказывали...
Go to the top of the page
 
+Quote Post
Alex03
сообщение Dec 7 2006, 14:11
Сообщение #20


Местный
***

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



Цитата(boez @ Dec 7 2006, 14:23) *
Вообще в гнутом С для выравнивания придуман атрибут, и там таких приколов (биты или байты) нету.

aligned (alignment)
This attribute specifies a minimum alignment (in bytes) for variables of the specified type.

Или щас в кейле компилятор не гнутый?

А вообще вот вы мне объясните, кто понимает - ведь массив это _единая_ переменная. Да, ее размер тоже обязан быть кратным выравниванию, в данном случае 4 (тоже кстати вопрос - а с какой радости по умолчанию байты ровняются по 4). Но он и так будет, 16 кратно 4. А тут я так понимаю компилер раскладывает байты с трехбайтными дырками? А если мне это пакет пришел и я его разобрать хочу? Как это оно вообще так получается?


ИМХО тут надо разобраться в этих исходных
Цитата
char p[16] - занимает 64 байта памяти.


Если это так то причин м.б. 2.
1. alignment на 64 байта, но сам массив занимает смежные 16 байт.
2. каждый элемент массива занимает по 4 байта (1+3), но тут ИМХО уже на упаковку (#pragma pack(), __attribute__ ((__packed__)) и прочие) глядеть надо.
Go to the top of the page
 
+Quote Post
Alexey Bishletov
сообщение Dec 8 2006, 09:33
Сообщение #21


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

Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557



Цитата(zltigo @ Dec 6 2006, 17:59) *
Да? Читаем:
Цитата

компилятор Keil
char p[16] - занимает 64 байта памяти. Смотрел в дебагере симулятора. Почему? Куда копать? В сторону aligment?


Продолжаем читать первое сообщение, находим "ALIGN", переходим к третьему сообщению:
Цитата(aaarrr @ Dec 4 2006, 00:21) *
Цитата(Kail @ Dec 3 2006, 23:28) *

AREA STACK, DATA, READWRITE, ALIGN=2

Для стека ALIGN должен быть 4.

Вот отсюда и пошел спор 2 или 4.

Цитата(zltigo @ Dec 6 2006, 17:59) *
Цитата

Собственно в самом С директива ALIGN не применима. Зачем читать CRefference?

Для понимания того, что прагмы управления alignment применяются "в самом С" и следует его почитать.

У прагмы свой формат, а речь шла все же про ASM.
Go to the top of the page
 
+Quote Post

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

 


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


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