СТЕК

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

---------------- С уважением.Ю.

Reply to
yura.v.podgornov
Loading thread data ...

Hello, yura.v.podgornov !

Что было, то и остается.

Hет конечно, только указатель меняется.

Cтек в PIC'е - 8 ячеек памяти шириной достаточной для хранения адреса и трехразрядный указатель, который инкрементируется/декрементируется при call/return. Hичего никакими нулями не заполняется.

С уважением, Дима Орлов.

Reply to
Dima Orlov

Hi Yura.V.Podgornov !

Совсем недавно 13 May 04 15:31, yura.v.podgornov писал к All:

yp> From: "yura.v.podgornov" snipped-for-privacy@atika-al.kiev.ua>

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

Reply to
Ruslan Mohniuc

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.