資料集
ここはhideyosiの学習帳です。いろいろな資料を集めたり整理したりしています。オイラ用のノートなので間違っていたり未完成だったりしますので信用度は相当低いことをあらかじめご了承くださいませ。

スタック anchor.png Edit

スタックとは、データを一時的に保存する場合によく使うデータ構造。

スタックは、データを入力した順と逆の順で取り出されるというFILO方式である。

スタックは、現在のデータ幅で行われるためリアルモード時は16Bit単位、32Bitプロテクトモード移行後は32Bit単位でデータを扱う。

スタックのセグメントベースはSS:SPである。

仮想的にスタックがこういう状態だとする。

【レジスタ】           【メモリ内に設けられたスタック】
  AX:0x1111                0x0F8│         │   
  BX:0x2222                     ├──────┤
  CX:0x3333                0x0FA│   ???    │   
  CX:0x4444                     ├──────┤
                            0x0FC│   ???    │  
                                 ├──────┤
                            0x0FE│   ???    │
                                 ├──────┤
                            0x100│   ???    │  ←スタックポインタは   
                                 └──────┘    0x100を指している
Page Top

PUSHの動作 anchor.png Edit

ここで 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レジスタ)に変化はない
Page Top

POPの動作 anchor.png Edit

何回か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の内容を交換したという状態になってしまう

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 3206, today: 1, yesterday: 1
Last-modified: 2024-01-06 (Sat) 22:37:41 (JST) (337d) by