Я так полагал, что поскольку регистр указателя стека S - 8-битный и указывает в 1 страницу,
то он уменьшается, скажем, от значения $FF до значения $00, если мы заносим в стек значения.
Если при значении указателя стека S = $00 мы занесем в стек еще 1 байт, то указатель стека S
примет значение $FF.
То есть стек на увеличение или уменьшение работает как-бы "по кругу", как в PIC-ах...
Но уже в который раз попадаются мне рассуждения про "overflow" и "underflow", типа:
Нет, я, конечно, понимаю, что при выходе за верхнюю или нижнюю границу стека, мы "запорем" частично его содержимое.Overflow and underflow wrote:The terms "overflow" and "underflow" refer to situations where the program is either attempting to push more data on to the stack when S is already at $FF, or attempting to pull data off of the stack when S is already at $00. Usually this implies a PHA vs. PLA mismatch of some sort.
Most commonly, "overflow" refers to pushing more items than the stack's array can hold, and "underflow" refers to pulling from an empty stack. But occasionally, especially with descending stacks, some people reverse these two terms.
Но сам процессор-то 6502, как не остановится при этом, так и никак аппаратно не среагирует на эти "overflow" и "underflow".
Так в чем же смысл этих рассуждений про "overflow" и "underflow", или я что-то не так понимаю?
Меня смутила реализация push и pop в JS-эмуляторе 6502:
Code: Select all
/*
* stackPush() - Push byte to stack
*
*/
function stackPush( value ) {
if( regSP >= 0 ) {
regSP--;
memory[(regSP&0xff)+0x100] = value & 0xff;
}
else
{
message( "Stack full: " + regSP );
codeRunning = false;
}
}
/*
* stackPop() - Pop byte from stack
*
*/
function stackPop() {
if( regSP < 0x100 ) {
value = memory[regSP+0x100];
regSP++;
return value;
}
else
{
message( "Stack empty" );
codeRunning = false;
return 0;
}
}
