СТЕК

Do you have a question? Post it now! No Registration Necessary

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



Re: СТЕК
Hello, yura.v.podgornov !

 > Вот заинтересовал такой вопрос.По команде 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



Site Timeline