資料集
ここはhideyosiの学習帳です。いろいろな資料を集めたり整理したりしています。オイラ用のノートなので間違っていたり未完成だったりしますので信用度は相当低いことをあらかじめご了承くださいませ。
1: 2005-12-01 (木) 00:00:00 ソース バックアップ No.1 を復元して編集 現: 2024-01-06 (土) 22:37:41 ソース 編集
Line 7: Line 7:
スタックのセグメントベースはSS:SPである。 スタックのセグメントベースはSS:SPである。
 +
 + 仮想的にスタックがこういう状態だとする。
 + 
 + 【レジスタ】          【メモリ内に設けられたスタック】
 +   AX:0x1111                0x0F8│        │
 +   BX:0x2222                    ├──────┤
 +   CX:0x3333                0x0FA│  ???    │
 +   CX:0x4444                    ├──────┤
 +                             0x0FC│  ???    │
 +                                 ├──────┤
 +                             0x0FE│  ???    │
 +                                 ├──────┤
 +                             0x100│  ???    │  ←スタックポインタは
 +                                 └──────┘    0x100を指している
 +
**PUSHの動作 [#ie74cacf] **PUSHの動作 [#ie74cacf]
-SP - データ幅(リアル時なら2、32Bitプロテクト時なら4)をして、SS:SPに値を代入する。+ ここで 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の動作 [#ie74cacf] 
 + 何回か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」され、「一つ下のメモリ」を指すようになる 
 +---- 
 +-COLOR(red){注意} 
 +--スタックが「-1」、「+1」とあるが、この場合、''現在のCPUのビット数''となる。なので、上の例では2づつ動いているが、これは16ビット状態(リアルモード)の場合。 
 +32ビット状態(プロテクトモード)の場合は4づつ動くことになる。 
 + 
 +--スタックへのPUSHやPOPは単に「順番に」行われるだけなので、どこから来たデータか?等は一切記憶されない。なので、順番を間違えるとデータは変化する。
-**POPの動作 [#gc1641ee] + レジスタを全部退避させて作業を行い、元に戻したかった。 
-SS:SPの値をとりだして、SP + データ幅をする。+       PUSH    AX 
 +       PUSH    BX 
 +       PUSH    CX 
 +       PUSH    DX 
 +  
 +       ・・・いろいろ作業・・・ 
 +  
 +       POP    DX 
 +       POP    CX 
 +       POP    AX        ←!?? ここ、BXじゃないの? 
 +       POP    BX        ←!??  ここ、AXじゃないの? 
 +  ばんざーい!これでレジスタは元に戻ったぞ! 
 +--ご覧の通り、順番が間違っている。なので、事実上、AXとBXの内容を交換したという状態になってしまう


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 3202, today: 1, yesterday: 0