Пн май 06, 2013 14:10:41
Пн май 06, 2013 14:41:22
Пн май 06, 2013 18:13:53
промежуточные значения, не что иное, как локальные переменныеVov123 писал(а):Я так думаю стек не предназначен для хранения переменных,этот участок ОЗУ предназначен для временного хранения промежуточных значений работы функций.
.. доступ то произвольный, только поменяв в стеке что-нибудь "лишнее", программу легко можно отправить в "нокаут"Vov123 писал(а):Да и доступ от туда не произвольный,а типа стопки тарелок,а взять можно только сверху.
... в отладчике все прекрасно видно ... размер и расположение задаются в свойствах проекта (вкладка Target)hovercraft писал(а):А вот что происходит с глобальными? выделяется в стеке или куче или сегменте данных. подкинте инфу.
Вт май 07, 2013 10:47:43
Стек используется для сохранения контекста программы при обработке прерываний(обеспечивается ядром) и вызове функций(обеспечивается компилятором или вручную в случае ассемблера)The Cortex-M3 processor automatically pushes registers R0–R3, R12, LR, PSR, and PC in the stack at interrupt entry and pops them back at interrupt exit....
....The common use of a stack is to save register contents before some data processing and then restore those contents from the stack after the processing task is done.
Вт май 07, 2013 11:06:08
не так категорично - стек можно использовать как угодно ...ibiza11 писал(а):Стек не используется для локальных переменных. Для них используется свободные регистры из банка регистров общего назначения и свободное ОЗУ микроконтроллера.
push {lr,r4,r5,r6}
; stack frame
sub sp,#16 ; выделяем буфер
........
add sp,#16 ; возврат в исходное состояние
pop {lr,r4,r5,r6}
bx lr
Вт май 07, 2013 11:19:50
Вт май 07, 2013 11:34:31
...не знаю, почему Вы так решилиVov123 писал(а):ТС,я так понял собрался в стеке хранить переменные постоянно
стек удобно применять, как локальный буфер ( в РС например (i808x-...), есть регистр BP специально для этого ... у ARM регистры более универсальны)hovercraft писал(а):1. Как я понимаю под локальные переменные память выделяется в стеке.
Вт май 07, 2013 11:42:37
Вт май 07, 2013 12:10:33
void funcion_X(char x){
char buff[16];
buff[0]=5;
buff[10]=buff[0]+x;
}
main(){
....
funcion_X(4);
; 60 void funcion_X(char x){
_funcion_X:
; 61 char buff[16];
; 62 buff[0]=5;
SBIW R28,16
; x -> Y+16
; buff -> Y+0
LDI R30,LOW(5)
ST Y,R30
; 63 buff[10]=buff[0]+x;
LDD R30,Y+16
LD R26,Y
ADD R30,R26
STD Y+10,R30
; 64 }
ADIW R28,17
RET
Вт май 07, 2013 12:26:09
Перечитайте стартовое сообщение и поймете, что автор задает вопрос не по ассемблеру. А так да, что угодно можно творить со стеком. Только вопрос не в этом заключался. Автор не знает куда компилятор засунет его глобальную структуру и поэтому спрашивает сколько нужно кучи и стека.ChipKiller писал(а):не так категорично - стек можно использовать как угодно ...
стек тут нипричем. здесь идет выделение памяти в ОЗУ, возможно в куче. Откуда вы знаете куда указывает Y?ChipKiller писал(а):SBIW R28,16 - не что иное как выделение буфера в стеке (r29:28==Y-регистр)
Вт май 07, 2013 12:58:43
... разумеется - аппаратный стек (или стек вызовов) хранится в SP, поэтому я и писал .ibiza11 писал(а):стек тут нипричем. здесь идет выделение памяти в ОЗУChipKiller писал(а):SBIW R28,16 - не что иное как выделение буфера в стеке (r29:28==Y-регистр)
... и речь шла о стеке данныхChipKiller писал(а):.конечно аппаратные возможности накладывают свой "отпечаток"
на стек влияют не только push и pop, но и команды вызова/возврата.ibiza11 писал(а):Стек, как уже было упомянуто работает по принципу стопки тарелок, с командами push и pop . А у Вас в примере просто относительная адресация.
str r4,[sp,#4]
... в том то и беда, что многие пытаются освоить ARM не понимая принципов.....ibiza11 писал(а):автор задает вопрос не по ассемблеру....
Вт май 07, 2013 13:40:12
Вт май 07, 2013 13:44:05
Вт май 07, 2013 15:16:42
Ср май 08, 2013 15:41:40
Чт май 09, 2013 15:59:40
menzoda писал(а):1. Память под локальные переменные если и выделяется, то в стеке. Компилятор может это дело оптимизировать и не выделять под них память, работая только с регистрами.
Чт май 09, 2013 16:29:33
int foo (int val)
{
int i, s;
int array[20];
s = 0;
for (i = 0; i < 20; i++)
array[i] = val;
for (i = 0; i < 20; i++)
s += array[i];
return s;
}
Эта функция скомпилировалась в это:
||foo|| PROC
[b]SUB sp,sp,#0x50[/b]
MOV r3,r0
MOV r0,#0
MOV r1,#0
MOV r2,sp
|L1.20|
STR r3,[r2,r1,LSL #2]
ADD r1,r1,#1
...
То, что выделенно жирным есть выделение памяти под локальный массив в стеке. Для переменных он не стал выделять память, ибо их можно хранить в регистрах, но можно сделать так:
int foo (int val)
{
[b]volatile[/b] int i, s;
int array[20];
...
После компиляции это станет следующим:
||foo|| PROC
[b]SUB sp,sp,#0x58[/b]
MOV r3,#0
STR r3,[[b]sp[/b],#0x50]
STR r3,[[b]sp[/b],#0x54]
MOV r1,[b]sp[/b]
|L1.20|
LDR r2,[[b]sp[/b],#0x54]
STR r0,[r1,r2,LSL #2]
LDR r2,[[b]sp[/b],#0x54]
ADD r2,r2,#1
...
Теперь мы заставили его выделить под переменные память в стеке.
Чт май 09, 2013 16:38:10
... модераторы похороните топик - больше срача, чем пользы ......ChipKiller писал(а):... короче тема для флейма ....
Чт май 09, 2013 17:33:57
menzoda писал(а):Ну а где тогда сидят локальные переменные?
Чт май 09, 2013 18:57:29
И это правильно, как говаривал разрушитель СССР..ChipKiller писал(а):... модераторы похороните топик - больше срача, чем пользы ......ChipKiller писал(а):... короче тема для флейма ....