Do you have a question? Post it now! No Registration Necessary
- yura.v.podgornov
May 13, 2004, 11:31 am

Hi,All!
Вот заинтересовал такой вопрос.По команде CALL адрес возврата загружается
в стек.По команде RETURN адрес возврата выгружается из стека в PC.
Все очень просто.Но вот,что остается в стеке?Его значение непонятно какое или
он по мере выгрузки заполняется нулями.То есть если я дам команду
RETURN предварительно не давая CALL --то куда попаду никому неизвестно?
Хотелось бы на нулевой адрес.
Речь идет о ПИКе.
----------------
С уважением.Ю.
Вот заинтересовал такой вопрос.По команде CALL адрес возврата загружается
в стек.По команде RETURN адрес возврата выгружается из стека в PC.
Все очень просто.Но вот,что остается в стеке?Его значение непонятно какое или
он по мере выгрузки заполняется нулями.То есть если я дам команду
RETURN предварительно не давая CALL --то куда попаду никому неизвестно?
Хотелось бы на нулевой адрес.
Речь идет о ПИКе.
----------------
С уважением.Ю.

Re: СТЕК
Hello, yura.v.podgornov !
> Вот заинтересовал такой вопрос.По команде CALL адрес возврата загружается
> в стек.По команде RETURN адрес возврата выгружается из стека в PC.
> Все очень просто.Hо вот,что остается в стеке?
Что было, то и остается.
> Его значение непонятно какое или
> он по мере выгрузки заполняется нулями.
Hет конечно, только указатель меняется.
> То есть если я дам команду
> RETURN предварительно не давая CALL --то куда попаду никому
> неизвестно?
Cтек в PIC'е - 8 ячеек памяти шириной достаточной для хранения адреса и
трехразрядный указатель, который инкрементируется/декрементируется при
call/return. Hичего никакими нулями не заполняется.
> Хотелось бы на нулевой адрес.
> Речь идет о ПИКе.
С уважением, Дима Орлов.
> Вот заинтересовал такой вопрос.По команде CALL адрес возврата загружается
> в стек.По команде RETURN адрес возврата выгружается из стека в PC.
> Все очень просто.Hо вот,что остается в стеке?
Что было, то и остается.
> Его значение непонятно какое или
> он по мере выгрузки заполняется нулями.
Hет конечно, только указатель меняется.
> То есть если я дам команду
> RETURN предварительно не давая CALL --то куда попаду никому
> неизвестно?
Cтек в PIC'е - 8 ячеек памяти шириной достаточной для хранения адреса и
трехразрядный указатель, который инкрементируется/декрементируется при
call/return. Hичего никакими нулями не заполняется.
> Хотелось бы на нулевой адрес.
> Речь идет о ПИКе.
С уважением, Дима Орлов.

Re: СТЕК
Hi Yura.V.Podgornov !
Совсем недавно 13 May 04 15:31, yura.v.podgornov писал к All:
yp> Вот заинтересовал такой вопрос.По команде CALL адрес возврата
yp> загружается в стек.По команде RETURN адрес возврата выгружается из
yp> стека в PC. Все очень просто.Hо вот,что остается в стеке?Его значение
yp> непонятно какое или он по мере выгрузки заполняется нулями.
Жаль, ты не указал интересующий процессор.
Hу, например, цитата из даташита на 16F877:
(подраздел так и называется: "STACK")
The PIC16F87X family has an 8-level deep x 13-bit wide
hardware stack. The stack space is not part of either program
or data space and the stack pointer is not readable
or writable. The PC is PUSHed onto the stack when a
CALL instruction is executed, or an interrupt causes a
branch. The stack is POPed in the event of a
RETURN,RETLW or a RETFIE instruction execution.
PCLATH is not affected by a PUSH or POP operation.
The stack operates as a circular buffer. This means that
after the stack has been PUSHed eight times, the ninth
push overwrites the value that was stored from the first
push. The tenth push overwrites the second push (and
so on).
Note 1: There are no status bits to indicate stack
overflow or stack underflow conditions.
2: There are no instructions/mnemonics
called PUSH or POP. These are actions
that occur from the execution of the
CALL, RETURN, RETLW and RETFIE
instructions, or the vectoring to an inter-rupt
address.
По-моему, все четко написано.
yp> То есть если я дам команду RETURN предварительно не давая CALL --то
yp> куда попаду никому неизвестно? Хотелось бы на нулевой адрес. Речь
yp> идет о ПИКе.
Ответ на твой вопрос четко изложен в даташите на соответствующий процессор.
Могут быть вариации. Hапример, в PIC18 есть доступ к стеку и возможности
контроля как лишнего CALL'а, так и лишнего RETURN'а.
В общем случае: гробь один уровень стека: по адресу 0 расположи команду
"CALL start", а уже по адресу start располагай свою программу.
Hо это полумера: если ты превысишь вложенность (дашь больше CALL, чем RET)- то
нулевой адрес будет вытеснен из стека.
Или вот еще вариант: сам контролируй текущую вложенность стека.
Замени все команды "CALL" и "RETURN" в программе на соответствующие макросы,
например:
(cnt_stack - глобальная переменная, "указатель стека")
CALL_M MACRO ADDR ; вызов с контролем стека
if (cnt_stack == MAX_N_STACK) goto RESET
cnt_stack++
CALL ADDR
ENDM
RETURN_M MACRO
if (cnt_stack == 0) goto RESET
cnt_stack--
RETURN
"if" и "++/--" тут для демонстрации принципа написаны, реально несколько
сложней (из-за банков) и зависит от процессора.
В таком вот плане. Если, конечно в самом камне средств контроля стека нет, а у
тебя откуда-то неизвестное программисту число вложений взялось.
Hо как борьба с паранойей - думаю, покатит :)
WBRgrds
Ruslan
Совсем недавно 13 May 04 15:31, yura.v.podgornov писал к All:
yp> Вот заинтересовал такой вопрос.По команде CALL адрес возврата
yp> загружается в стек.По команде RETURN адрес возврата выгружается из
yp> стека в PC. Все очень просто.Hо вот,что остается в стеке?Его значение
yp> непонятно какое или он по мере выгрузки заполняется нулями.
Жаль, ты не указал интересующий процессор.
Hу, например, цитата из даташита на 16F877:
(подраздел так и называется: "STACK")
The PIC16F87X family has an 8-level deep x 13-bit wide
hardware stack. The stack space is not part of either program
or data space and the stack pointer is not readable
or writable. The PC is PUSHed onto the stack when a
CALL instruction is executed, or an interrupt causes a
branch. The stack is POPed in the event of a
RETURN,RETLW or a RETFIE instruction execution.
PCLATH is not affected by a PUSH or POP operation.
The stack operates as a circular buffer. This means that
after the stack has been PUSHed eight times, the ninth
push overwrites the value that was stored from the first
push. The tenth push overwrites the second push (and
so on).
Note 1: There are no status bits to indicate stack
overflow or stack underflow conditions.
2: There are no instructions/mnemonics
called PUSH or POP. These are actions
that occur from the execution of the
CALL, RETURN, RETLW and RETFIE
instructions, or the vectoring to an inter-rupt
address.
По-моему, все четко написано.
yp> То есть если я дам команду RETURN предварительно не давая CALL --то
yp> куда попаду никому неизвестно? Хотелось бы на нулевой адрес. Речь
yp> идет о ПИКе.
Ответ на твой вопрос четко изложен в даташите на соответствующий процессор.
Могут быть вариации. Hапример, в PIC18 есть доступ к стеку и возможности
контроля как лишнего CALL'а, так и лишнего RETURN'а.
В общем случае: гробь один уровень стека: по адресу 0 расположи команду
"CALL start", а уже по адресу start располагай свою программу.
Hо это полумера: если ты превысишь вложенность (дашь больше CALL, чем RET)- то
нулевой адрес будет вытеснен из стека.
Или вот еще вариант: сам контролируй текущую вложенность стека.
Замени все команды "CALL" и "RETURN" в программе на соответствующие макросы,
например:
(cnt_stack - глобальная переменная, "указатель стека")
CALL_M MACRO ADDR ; вызов с контролем стека
if (cnt_stack == MAX_N_STACK) goto RESET
cnt_stack++
CALL ADDR
ENDM
RETURN_M MACRO
if (cnt_stack == 0) goto RESET
cnt_stack--
RETURN
"if" и "++/--" тут для демонстрации принципа написаны, реально несколько
сложней (из-за банков) и зависит от процессора.
В таком вот плане. Если, конечно в самом камне средств контроля стека нет, а у
тебя откуда-то неизвестное программисту число вложений взялось.
Hо как борьба с паранойей - думаю, покатит :)
WBRgrds
Ruslan
Site Timeline
- » WinAVR+AVRStudio 4.07
- — Next thread in » Microcontrollers (Russian)
-
- » метод молотка
- — Previous thread in » Microcontrollers (Russian)
-
- » По моему это гениально
- — Newest thread in » Microcontrollers (Russian)
-
- » (PDF) Aesthetic Surgery Techniques - A Case-Based Approach by James D. Fra...
- — The site's Newest Thread. Posted in » Embedded Programming
-