資料集
ここはhideyosiの学習帳です。いろいろな資料を集めたり整理したりしています。オイラ用のノートなので間違っていたり未完成だったりしますので信用度は相当低いことをあらかじめご了承くださいませ。
スタック
スタックとは、データを一時的に保存する場合によく使うデータ構造。
スタックは、データを入力した順と逆の順で取り出されるというFILO方式である。
スタックは、現在のデータ幅で行われるためリアルモード時は16Bit単位、32Bitプロテクトモード移行後は32Bit単位でデータを扱う。
スタックのセグメントベースはSS:SPである。
仮想的にスタックがこういう状態だとする。 【レジスタ】 【メモリ内に設けられたスタック】 AX:0x1111 0x0F8│ │ BX:0x2222 ├──────┤ CX:0x3333 0x0FA│ ??? │ CX:0x4444 ├──────┤ 0x0FC│ ??? │ ├──────┤ 0x0FE│ ??? │ ├──────┤ 0x100│ ??? │ ←スタックポインタは └──────┘ 0x100を指している
PUSHの動作
ここで PUSH AX と命令した! 【レジスタ】 【メモリ内に設けられたスタック】 AX:0x1111 0x0F8│ │ BX:0x2222 ├──────┤ CX:0x3333 0x0FA│ ??? │ CX:0x4444 ├──────┤ ─ PUSH AX → 0x0FC│ ??? │ ├──────┤ 0x0FE│ ??? │ ├──────┤ 0x100│ ??? │ ←スタックポインタは └──────┘ 0x100を指している
【レジスタ】 【メモリ内に設けられたスタック】 AX:0x1111 0x0F8│ │ BX:0x2222 ├──────┤ CX:0x3333 0x0FA│ ??? │ CX:0x4444 ├──────┤ 0x0FC│ ??? │ ├──────┤ 0x0FE│ 0x1111 │ ←スタックポインタは ├──────┤ 0x1FEを指している 0x100│ ??? │ └──────┘
- PUSHの結果・・・・
- スタックポインタ(レジスタ)の内容が「-1」され、「一つ上のメモリ」を指すようになる
- スタックにデータが転送される
- 転送元(この場合はAXレジスタ)に変化はない
POPの動作
何回かPUSHした後、POP AX と命令した! 【レジスタ】 【メモリ内に設けられたスタック】 AX:0x5555 0x0F8│ │ BX:0x6666 ├──────┤ CX:0x7777 0x0FA│ 0x9999 │ ←スタックポインタは CX:0x8888 ├──────┤ 0x0FAを指している ← POP AX ─ 0x0FC│ 0x0967 │ ├──────┤ 0x0FE│ 0x1234 │ ├──────┤ 0x100│ 0x1111 │ └──────┘
【レジスタ】 【メモリ内に設けられたスタック】 AX:0x9999 0x0F8│ │ BX:0x6666 ├──────┤ CX:0x7777 0x0FA│ 0x9999 │ CX:0x8888 ├──────┤ 0x0FC│ 0x0976 │ ←スタックポインタは ├──────┤ 0x1FCを指している 0x0FE│ 0x1234 │ ├──────┤ 0x100│ 0x1111 │ └──────┘
- POPの結果・・・・
- スタックからデータが転送される
- スタックポインタ(レジスタ)の内容が「+1」され、「一つ下のメモリ」を指すようになる
- 注意
- スタックが「-1」、「+1」とあるが、この場合、現在のCPUのビット数となる。なので、上の例では2づつ動いているが、これは16ビット状態(リアルモード)の場合。 32ビット状態(プロテクトモード)の場合は4づつ動くことになる。
- スタックへのPUSHやPOPは単に「順番に」行われるだけなので、どこから来たデータか?等は一切記憶されない。なので、順番を間違えるとデータは変化する。
レジスタを全部退避させて作業を行い、元に戻したかった。 PUSH AX PUSH BX PUSH CX PUSH DX ・・・いろいろ作業・・・ POP DX POP CX POP AX ←!?? ここ、BXじゃないの? POP BX ←!?? ここ、AXじゃないの? ばんざーい!これでレジスタは元に戻ったぞ!
- ご覧の通り、順番が間違っている。なので、事実上、AXとBXの内容を交換したという状態になってしまう
Counter: 3206,
today: 1,
yesterday: 1
Last-modified: 2024-01-06 (Sat) 22:37:41 (JST) (337d) by