Assembly Language
スタック
サーチ…
備考
コンピュータのスタックは、複数の書籍のようなものです。 PUSHは1つを先頭に追加し、 POPは最前面に移動します。実生活と同様に、スタックは無限になることができないため、最大サイズになります。このスタックは、アルゴリズムのソートや、大量のデータや、別の操作を実行しながら安全なレジスタ値を扱うために使用できます。
Zilog Z80 Stack
レジスタsp
はスタックポインタとして使用され、 スタックに最後に格納された値(スタックの最上位)を指します。したがって、 EX (sp),hl
はhl
の値をスタックの最上部の値と交換します。
「トップ」という言葉に反して、スタックが減少することにより、メモリに生えるsp
増加させることにより、およびリリース(「ポップ」)の値sp
。
ためsp
= $4844
の値を持つ1
、 2
、 3
スタックに格納された( 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 (最後から最初の)キューです。 CALL
はJP
と同じですが、スタックの先頭にCALL
後の次の命令のアドレスもプッシュします。 RET
はJP
と同様であり、スタックからアドレスをポップしてそのアドレスにジャンプします。
警告 :割り込みを行う場合、 sp
リターンアドレス(実際に格納します割り込み信号として割り込み処理ルーチンのために確保十分な空き領域と、割込み信号の間に有効でなければなりませんpc
上で、さらにデータを格納することができるハンドラルーチンを呼び出す前)、スタックすることもできます。割り込みが発生した場合、 sp
より先の値は "予期せず"変更される可能性があります。
高度なトリック :とZ80のPUSH
11クロック・サイクル(11トン)を取り、 POP
10トンを取って、広げられたPOP
/ PUSH
トラフを含むすべてのレジスタ、 EXX
影変異体については、さらに速く展開されたよりも、メモリのブロックをコピーするための最速の方法だったLDI
。しかし、あなたは、メモリ破損を避けるために、割り込み信号の間にコピーを作成する必要がありました。また、 PUSH
を展開することで、メモリをZX Spectrumの特定の値で埋める最も速い方法でした(また、適切にタイムアウトしなかった場合や、 DI
完了した場合は、割り込みによる破損のリスクがあります)。