サーチ…


備考

コンピュータのスタックは、複数の書籍のようなものです。 PUSHは1つを先頭に追加し、 POPは最前面に移動します。実生活と同様に、スタックは無限になることができないため、最大サイズになります。このスタックは、アルゴリズムのソートや、大量のデータや、別の操作を実行しながら安全なレジスタ値を扱うために使用できます。

Zilog Z80 Stack

レジスタspスタックポインタとして使用され、 スタックに最後に格納された値(スタックの最上位)を指します。したがって、 EX (sp),hlhlの値をスタックの最上部の値と交換します。

「トップ」という言葉に反して、スタックが減少することにより、メモリに生えるsp増加させることにより、およびリリース(「ポップ」)の値sp

ためsp = $4844の値を持つ123スタックに格納された( 3それの上部にある、最後の値としてスタック上にプッシュされる)、メモリは次のようになります。

|    address | value bytes | comment (btw, all numbers are in hexadecimal)
| ---------- | ----------- | ---------------------------------
|       4840 | ?? ??       | free stack spaces to be used by next push/call
|       4842 | ?? ??       | or by interrupt call! (don't expect values to stay here)
| sp -> 4844 | 03 00       | 16 bit value "3" on top of stack
|       4846 | 02 00       | 16 bit value "2"
|       4848 | 01 00       | 16 bit value "1"
|       484A | ?? ??       | Other values in stack (up to it's origin)
|       484C | ?? ??       | like for example return address for RET instruction

スタック上の命令の動作例:

    LD   hl,$0506
    EX   (sp),hl           ; $0003 into hl, "06 05" bytes at $4844
    POP  bc                ; like: LD c,(sp); INC sp; LD b,(sp); INC sp
                           ; so bc is now $0506, and sp is $4846
    XOR  a                 ; a = 0, sets zero and parity flags
    PUSH af                ; like: DEC sp; LD (sp),a; DEC sp; LD (sp),f
                           ; so at $4844 is $0044 (44 = z+p flags), sp is $4844
    CALL $8000             ; sp is $4842, with address of next ins at top of stack
                           ; pc = $8000 (jumping to sub-routine)
                           ; after RET will return here, the sp will be $4844 again
    LD   (L1+1),sp         ; stores current sp into LD sp,nn instruction (self modification)
    DEC  sp                ; sp is $4843
L1  LD   sp,$1234          ; restores sp to $4844 ($1234 was modified)
    POP  de                ; de = $0044, sp = $4846
    POP  ix                ; ix = $0002, sp = $4848
    ...

    ...
    ORG  $8000
    RET                    ; LD pc,(sp); INC sp; INC sp
                           ; jumps to address at top of stack, "returning" to caller

要約PUSHはスタックの最上位に値を格納し、 POPはスタックの先頭から値をフェッチします.LIFO (最後から最初の)キューです。 CALLJPと同じですが、スタックの先頭にCALL後の次の命令のアドレスもプッシュします。 RETJPと同様であり、スタックからアドレスをポップしてそのアドレスにジャンプします。

警告 :割り込みを行う場合、 spリターンアドレス(実際に格納します割り込み信号として割り込み処理ルーチンのために確保十分な空き領域と、割込み信号の間に有効でなければなりませんpc上で、さらにデータを格納することができるハンドラルーチンを呼び出す前)、スタックすることもできます。割り込みが発生した場合、 spより先の値は "予期せず"変更される可能性があります。

高度なトリック :とZ80のPUSH 11クロック・サイクル(11トン)を取り、 POP 10トンを取って、広げられたPOP / PUSHトラフを含むすべてのレジスタ、 EXX影変異体については、さらに速く展開されたよりも、メモリのブロックをコピーするための最速の方法だったLDI 。しかし、あなたは、メモリ破損を避けるために、割り込み信号の間にコピーを作成する必要がありました。また、 PUSHを展開することで、メモリをZX Spectrumの特定の値で埋める最も速い方法でした(また、適切にタイムアウトしなかった場合や、 DI完了した場合は、割り込みによる破損のリスクがあります)。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow