PDA

Просмотр полной версии : Как работает стек GO SUB?



TomCaT
07.09.2010, 23:46
Роясь в литературе для соседней темы про отличия 16к и 48к, с удивлением обнаружил, что к нефиксированной области стека подпрограмм BASIC (стека GO SUB) не относится ни одна переменная-указатель адреса в системных переменных ОС. Известно, где его дно - адрес последнего байта совпадает с RAMTOP, но т.к. этот стек, как и машинный стек, тоже растет вниз (проверял), то где проходит граница стеков? Как, например, RETURN определяет адрес трехбайтной структуры оператора после последнего GO SUB?

Вот например книга "Программирование в машинных кодах" (VA PRINT'93) указывает пример просмотра содержимого стека. Пример не сильно правильный в плане адресов, но там много опечаток и ошибок, так что верить всему там надо с оглядкой (хотя именно по ней мне пришлось впервые изучать коды, ох это было нелегко копаться в ошибках :) ).

Но, короче, пример пользуется CLEAR, несколькими GO SUB, и затем выводом содержимого памяти от адреса до адреса, записанных числами, а не взятых из переменных... То есть, они заранее знали, куда помещают стек с помощью CLEAR, и сколько было выполнено GO SUB, поэтому знают примерное место, откуда начинать просмотр. Там же упоминается, что фирма SINCLAIR не совсем уверенна в написании GO SUB (??).

Во всяком случае, сколько написано программ с подпрограммами, и даже многократной вложенности, а все как будто хорошо работает. Знает ли уважаемый All, как ориентируются в памяти стековые команды, и действительно ли утверждение про фирму Sinclair?

Barmaley_m
08.09.2010, 00:19
Я когда-то читал об этом в Полном дизассемблере от Яна Логана и Френка О-Хары - реализация операторов GO SUB и RETURN. Подробности уже забыл, но по-моему нижнюю (по адресам) границу стека GO SUB задает переменная ERR_SP (23613, 23614). После выполнения оператора GO SUB ее значение уменьшается на 3. В стек записывается номер строки, в которой находится оператор GO SUB, и номер оператора, следующего за ним. Если оператор GO SUB был первым в строке, то в качестве номера оператора возврата записывается двойка. Только что написал простейшую программу на бейсике для проверки - так и есть.

Поскольку ERR_SP задает верхнюю границу машинного стека, и по адресу, лежащему по ERR_SP, осуществляется возврат при ошибке (2 байта) - то стек GO SUB начинается на 2 байта выше, чем значение ERR_SP.

goodboy
08.09.2010, 00:24
Я когда-то читал об этом в Полном дизассемблере от Яна Логана и Френка О-Хары

ftp://ftp.worldofspectrum.org/pub/sinclair/books/CompleteSpectrumROMDisassemblyThe.txt

искать GO-SUB

Barmaley_m
08.09.2010, 00:29
Насчет же того, что программисты, которые писали Sinclair Basic якобы не знали в полной мере, как работают GO SUB и RETURN - это конечно же полная чушь. Если проанализировать сооветствующие места бейсика - то все там правильно и логично сделано, т.е. авторы явно четко представляли себе, что они делают и зачем. Тем более что бейсик работает, не глючит в этом плане.

TomCaT
09.09.2010, 23:03
Все ясно, спасибо.

Откуда и когда взяли авторы той книги Ва Принт информацию о неуверенности написания, не известно, может, из интервью каких-нибудь, или из третьих рук. Книга похожа на переведенную. Я, конечно, так и думал, что там все в норме.