logo
ZX-Review-1992-01-12

46. POP <числовая переменная>

Клавиша: Q

Команда POP удаляет последний адрес со стека, обеспечивавшего правильную работу команд GO SUB, DO LOOP, PROC. Если при этом Вы используете параметр <числовая переменная>, то номер строки, к которой должен был бы быть исполнен переход, если бы вы не сняли его со стека, запоминается в этой переменной.

Команда POP может позволить Вам завершать работу в подпрограммах, процедурах и циклах не естественным путем и при этом закупорки стека не произойдет, если выходя в неположенном месте, например из цикла, Вы снимете адрес естественного возврата со стека. Команда POP без параметра просто удалит этот адрес со стека, а если Вы используете ее с параметром, например с переменной loc, то этот адрес еще останется в вашей переменной и, может быть, он Вам впоследствии для чего нибудь пригодится. Может быть, по ходу программы Вы примете решение о том, что POP был сделан неправильно и надо все таки перейти туда, куда должна была возвращать Ваша процедура. В этом случае знание lос позволит Вам сделать GO TO lос+1, хотя надо отметить, что это все же не вполне то же самое, что и естественный RETURN. Дело в том, что адрес, откуда Вы прошли в подпрограмму, запомнен на стеке и после RETURN Вы возвращаетесь туда, откуда уходили. Возвращаетесь либо на следующую строку, либо на следующий оператор в той же строке, если он есть. Переход же по GO TO loc+1 не может вернуть Вас к следующему оператору, а только к следующей строке.

Пример:

100 GO SUB 500

110 STOP

500 POP loc

510 PRINT "Подпрограмма вызывалась из строки "; loc

520 GO TO loc

Если Вы в строке 520 поставите

520 RETURN

то получите сообщение "RETURN without GOSUB", поскольку к этому моменту на стеке уже не будет никакого адреса, ведь он был снят командой POP.

Вызов команды POP, когда на стеке нет данных, дает сообщение об ошибке V, "No POP data".