資料集
ここはhideyosiの学習帳です。いろいろな資料を集めたり整理したりしています。オイラ用のノートなので間違っていたり未完成だったりしますので信用度は相当低いことをあらかじめご了承くださいませ。
2: 2007-03-24 (土) 17:59:42 ソース バックアップ No.2 を復元して編集 現: 2024-01-06 (土) 22:37:41 ソース 編集
Line 6: Line 6:
 MOV    AX,0x11        ←まあ問題ないよね?相手がAXなんだからイヤでも16ビット  MOV    AX,0x11        ←まあ問題ないよね?相手がAXなんだからイヤでも16ビット
 + 
 MOV    AX, WORD 0x11  ←無駄ではあるが、これは「間違い」だろうか??  MOV    AX, WORD 0x11  ←無駄ではあるが、これは「間違い」だろうか??
Line 52: Line 52:
こんな実験もしてみた。 こんな実験もしてみた。
 MOV AX,0x00000044    ←エラーなし  MOV AX,0x00000044    ←エラーなし
 + 
 MOV AX,0x11223344    ←エラー!!  MOV AX,0x11223344    ←エラー!!
Line 62: Line 62:
 MOV AX, BYTE [0x10] ← こうやればAXには0x0011が入るのか?  MOV AX, BYTE [0x10] ← こうやればAXには0x0011が入るのか?
                         おーー! エラー!                          おーー! エラー!
 +さらにこんなの・・・
 + MOV AL,BYTE 0x11223344
 +うほ!エラーだよ!!!。しかもデータレンジのエラー!
 +・・・わかってきたぞ・・・。NASK(あるいはアセンブラ?)では、とにもかくにも、''「切捨ては決してしない」''ってことなんじゃないのか???
----- 
-[[NASK/書式]]+**こういう法則かなぁ・・・ [#hfd51b04] 
 +-アセンブラでは、全ての代入に桁指定をする 
 +-補完はするが、決して切り捨てをしない
-対象に数値等を代入する場合、桁を指定してやる必要がある。+相手がレジスタだろうがなんだろうが、とにかく全て桁を指定する!
-たとえば0x11を代入しようとした場合、+当たり前だが、桁指定と指定された物が矛盾してはいけない。
--8ビット(0x11)なのか? + MOV    WORD AX,WORD 0x1122 
--16ビット(0x0011)なのか? +  
--32ビット(0x00000011)なのか?+ MOV    BYTE [0x0043],BYTE 0x11 
 +  
 + MOV    WORD [0x0044],WORD DX 
 +  
 + ※どれも問題ない。とにかく全て桁を指定する。
-を教えてやらないといけない。(それによって挙動が変化するので)+問題がある指定 
 + 指定と矛盾する 
 + MOV    BYTE AX,BYTE 0x13    ← AXは16bitのレジスタ。BYTE指定はおかしい
-|8ビット指定|BYTE| + 切捨ては決してしてくれない 
-|16ビット指定|WORD| + MOV    BYTE AL,BYTE 0x11223344 ←たとえBYTE指定しても、0x11223344は8bitデータじゃない。 
-|32ビット指定|DWORD|+                                   (自動で0x11223344を0x44に切り捨てしたりしてくれない)
--具体例(8ビット指定) + 以下は問題がない(補完) 
- MOV    [0x0042],0x11 + MOV    WORD AX, WORD 0x11   ←0x11と0x0011は同じこと。WORD指定で頭00を補完してくれる 
-        ↑ +  
-      間違い。0x11というが、これは0x11(8ビット)なのか、0x0011(16ビット)なのか分らない!+ MOV    WORD AX,WORD 0x00000011  ←一見切り捨てに見えるが、0x00000011と0x11はまったく同じこと。 
 +                                   なので、「元々0x11だった」と理解すれば、補完になる
- MOV BYTE [0x0042],0x11 +COLOR(blue){以上の単純な法則で全てOK。これで少なくとも''「間違いである!」''ということは起きなくなる}
-         ↑ +
-       桁が指定された。BYTEなので、0x11は素直に0x11(8ビット)だと解釈される+
--具体例(16ビット指定) +**実際の書き方(省略) [#te73527d
- MOV    [0x0042],0x11 +上記の簡単な法則が全て。後は、「省略しても特定できるかどうか」だけとなる。
-         ↑ +
-       間違い。0x11というが、これは0x11(8ビット)なのか、0x0011(16ビット)なのか分らない!+
- MOV WORD [0x0042],0x11 +省略しても特定できるのでエラーにならない例 
-        ↑ + MOV   WORD AX,WORD 0x1122    ←本来の書き方 
-      桁が指定された。WORDなので、0x11は0x0011(16ビット)だと解釈される+ MOV    AX,WORD 0x1122        ←AXは16bitレジスタと解りきっているので省略可 
 + MOV    AX,0x1122              ←但し注意。これは0x1122が16bitと特定できるのではない。 
 +                                 ・AXが16bitなんだから、当然値も16bitだろう 
 +                                 ・うん、4桁だし、問題もないよね? 
 +                                 と、こう理解しているに過ぎない。 
 +  
 + MOV    WORD DX,WORD 0x11      ←本来の書き方 
 + MOV    DX,WORD 0x11          ←DXは16bitに特定できる。0x11も0x0011と同じ 
 +                                 なのでWORD指定しても矛盾しない(補完) 
 + MOV    DX,0x11                ←上の例と同じで、0x11を見て判断しているのではない。 
 +                                 あくまでもDX(本来ならWORD DX)によって16bitに 
 +                                 特定され、0x11は16bit化しても矛盾しないので 
 +                                 エラーにならないに過ぎない。 
 +  
 + MOV BYTE [0x0041],BYTE 0x22    ←本来の書き方(エラーにならない) 
 + MOV BYTE [0x0041],0x22        ←・メモリに対しBYTE指定。当然値もBYTEだろう。 
 +                                  ・0x22はBYTE指定と矛盾しないな。OK! 
 +                                 ・エラーにならない。 
 + MOV [0x0041],BYTE 0x22        ←・メモリにバイト指定がないなぁ。何バイトだ? 
 +                                 ・うん、値にはBYTE指定か。じゃあメモリをBYTEと 
 +                   決め付けても問題ないだろう。 
 +                                 ・エラーにならない 
 +-COLOR(blue){下2例のメモリへのMOV。メモリ側と値側。とにかくどちらか一方でも指定があれば他方は特定できる。・・・じゃ、どっちを省略するのが正しい??} 
 +-COLOR(blue){少なくともどちらを省略してもエラーにはならない。それどころかどちらを省略しても、また省略しなくても、出てくるバイナリはまったく同一である。} 
 + MOV BYTE [0x0041],BYTE 0x22  ←┐ 
 + MOV BYTE [0x0041], 0x22      ←┼── 全て同じこと。バイナリも同一 
 + MOV [0x0041],BYTE 0x22        ←┘
-***実際の挙動 [#v35a16ba]+特定ができない例:(エラーになる) 
 + MOV [0x0041],0x11              ←・ん?何バイト?メモリにも値にも指定がないぞ? 
 +                                 ・え?値が0x11だからBYTE指定だろうって? 
 +                                 ・それは解らんぞ?もし0x0011なら0x0041番地と0x0042番地 
 +                                   にも書かなくちゃいけない。どっちだ? 
 +                                 ・エラーになる(特定しきれない) 
 +  
 + MOV [0x0041],0x1122            ←・これならいいだろう?値は16bit。WORD指定だ! 
 +                                 ・値が0x001122っていう可能性はないの?それ次第 
 +                                   では0x0043にも書かなくちゃいけない。どっち? 
 +                                 ・エラーになる(特定しきれない) 
 +  
 + MOV [0x0041],0x11223344        ←・これならどうだ!お前DWORDまでだろう? 
 +                                   値が32bitなんだから、値から32bit(DWORD指定)と 
 +                                   特定できるはずだ! 
 +                                 ・この値がさ、0x000000000011223344じゃないって 
 +                                   保障ある?。ないよね?。やっぱり特定できない。 
 +                                 ・エラーになる(特定しきれない) 
 + 
 + 
 +-COLOR(blue){省略していいのか悪いのか、ごっちゃになってわからなくなっちゃった!} 
 +--COLOR(red){そういう場合はなまじっか考えず、''全部指定しちゃう''のがいい。そうすれば少なくともエラーにはならないし、正解の省略と出てくるバイナリは変わらない。それでもエラーになるっていうなら、矛盾・切捨て違反のどちらかだと、間違いの特定もできるし。} 
 + 
 + 
 + 
 + 
 +***実際の挙動(メモリへの代入) [#v35a16ba]
-8ビット指定 -8ビット指定
 MOV BYTE [0x0042],0x11  MOV BYTE [0x0042],0x11
 + 
   :    ├────┤        :    ├────┤    :    ├────┤        :    ├────┤
 0x40番地 │ 0x32  │      0x40番地 │ 0x32  │  0x40番地 │ 0x32  │      0x40番地 │ 0x32  │
Line 131: Line 191:
 MOV WORD [0x0042],0x11  MOV WORD [0x0042],0x11
 + 
   :    ├────┤        :    ├────┤    :    ├────┤        :    ├────┤
 0x40番地 │ 0x32  │      0x40番地 │ 0x32  │  0x40番地 │ 0x32  │      0x40番地 │ 0x32  │
Line 140: Line 200:
         ├────┤              ├────┤    解釈される。値が16ビット          ├────┤              ├────┤    解釈される。値が16ビット
 0x43番地 │ 0x96  │  ⇒  0x43番地 │ 0x00  │  ←なのだから0x43も変化する  0x43番地 │ 0x96  │  ⇒  0x43番地 │ 0x00  │  ←なのだから0x43も変化する
-         ├────┤              ├────┤ +         ├────┤              ├────┤   (リトルエンディアンで値が 
- 0x44番地 │ 0xEF  │      0x44番地 │ 0xEF  │+ 0x44番地 │ 0xEF  │      0x44番地 │ 0xEF  │     逆さまになるのに注意)
         ├────┤              ├────┤          ├────┤              ├────┤
 0x45番地 │ 0x89  │      0x45番地 │ 0x89  │  0x45番地 │ 0x89  │      0x45番地 │ 0x89  │
Line 156: Line 216:
 MOV DWORD [0x0042],0x11  MOV DWORD [0x0042],0x11
 + 
   :    ├────┤        :    ├────┤    :    ├────┤        :    ├────┤
 0x40番地 │ 0x32  │      0x40番地 │ 0x32  │  0x40番地 │ 0x32  │      0x40番地 │ 0x32  │
Line 166: Line 226:
 0x43番地 │ 0x96  │  ⇒  0x43番地 │ 0x00  │  ←なのだから0x43、0x44、0x45  0x43番地 │ 0x96  │  ⇒  0x43番地 │ 0x00  │  ←なのだから0x43、0x44、0x45
         ├────┤              ├────┤    まで変化する          ├────┤              ├────┤    まで変化する
- 0x44番地 │ 0xEF  │  ⇒  0x44番地 │ 0x00  │  ← + 0x44番地 │ 0xEF  │  ⇒  0x44番地 │ 0x00  │  ←(リトルエンディアンで値が 
-         ├────┤              ├────┤+         ├────┤              ├────┤     逆さまになるのに注意)
 0x45番地 │ 0x89  │  ⇒  0x45番地 │ 0x00  │  ←  0x45番地 │ 0x89  │  ⇒  0x45番地 │ 0x00  │  ←
         ├────┤              ├────┤          ├────┤              ├────┤
 0x46番地 │ 0xFF  │      0x46番地 │ 0xFF  │  0x46番地 │ 0xFF  │      0x46番地 │ 0xFF  │
   :    ├────┤        :    ├────┤    :    ├────┤        :    ├────┤
- 
- 
- 
-*どんな時に桁指定が必要なのか? [#j739aedb] 
--対象(代入する相手)が''レジスタ以外は全部''と考えたほうがわかりやすい。 


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