1: 2007-03-24 (土) 15:29:55 |
2: 2007-03-24 (土) 17:59:42 |
| + | COLOR(red){くっそ!アカン!どうも理解が甘い!以下は間違ってます!(お勉強&再整理開始・・・) } |
| + | |
| + | ---- |
| + | -桁指定の考え方は、''基本は全て指定しよ!''ってことでいいのかな・・・ |
| + | -たとえばレジスタ相手。これだって、「指定して間違い」ってわけじゃないはず。ええと・・・ |
| + | |
| + | MOV AX,0x11 ←まあ問題ないよね?相手がAXなんだからイヤでも16ビット |
| + | |
| + | MOV AX, WORD 0x11 ←無駄ではあるが、これは「間違い」だろうか?? |
| + | |
| + | ・・・ふむ・・・実験の結果、少なくとも「間違いではない」ようだ・・・ |
| + | |
| + | こういうのはおかしくなるかな??? |
| + | |
| + | MOV WORD AX,WORD 0x11 |
| + | |
| + | あれれれ?? これも正常にコンパイルできたなぁ。これも、「別に間違いではない」って理解でいいのかな?? |
| + | |
| + | たとえばこうしたとするよね? |
| + | MOV [0x00ff],0x11 |
| + | |
| + | これが間違いなのは分る。正解は |
| + | MOV [0x00ff],WORD 0x11 |
| + | これでコンパイルが通る。・・・しかし疑問だ。 |
| + | -最初の、アドレスを指定している部分。ここ、0x00ffって言うけど、これが0xffなのか、0x00ffなのか、0x000000ffなのか・・・って、おい!!! |
| + | |
| + | ''あ〜!'' そっか!なるほどなるほど!。そうだよ!アドレス指定の場合は、[0xff]も[0x00ff]も[0x000000ff]も同じことじゃないか!!! |
| + | |
| + | ん?じゃあもしかして・・・・ |
| + | MOV WORD [0x00ff],WORD 0x11 |
| + | これもいいの??? |
| + | |
| + | あっちゃぁ〜。いいんじゃん!(エラーないし、同じバイナリが出てくる) |
| + | |
| + | うーん。しかしそうなると分らん。P37の、 MOV BYTE [678],123 。これはどう理解すれば・・・ |
| + | |
| + | あーーー!! まってまって??。勘違いしてたかも!? |
| + | |
| + | ''値の桁数はわからない''ってのがおかしいのか。だって、0x11も0x0011も0x00000011も値としてはまったく同じことなんだよね??? |
| + | |
| + | メモリのほうに桁指定を入れるってのはようするに、「メモリ素子何個使う?」っていう理解でいいのかな???? |
| + | |
| + | ・・・そうすると、たとえば |
| + | MOV BYTE [678],0x11223344 |
| + | こんなことしたらどうなるの???? |
| + | |
| + | あー・・・エラーになる。じゃ、これは? |
| + | MOV BYTE [678],0x00000044 |
| + | |
| + | ''おーーーー!!'' エラー出ない!!!!!! |
| + | |
| + | こんな実験もしてみた。 |
| + | MOV AX,0x00000044 ←エラーなし |
| + | |
| + | MOV AX,0x11223344 ←エラー!! |
| + | |
| + | おぉ!予測どおり!しかも、 MOV AX,0x11223344 と MOV BYTE [678],0x11223344 は、同じエラー(data range error.)が出る!! 分ってきたぞ!!! |
| + | |
| + | じゃあこれはどうなる? |
| + | たとえば0x10番地に0x11、0x11番地に0x22を入れておいたとして・・・ |
| + | MOV AX, [0x10] ← これは分る。AXには、0x2211が代入されるはず。 |
| + | MOV AX, BYTE [0x10] ← こうやればAXには0x0011が入るのか? |
| + | おーー! エラー! |
| + | |
| + | |
| + | |
| + | |
| + | ---- |
| + | |
| + | |
| [[NASK/書式]] | | [[NASK/書式]] |
| | | |
| ↑ | | ↑ |
| 桁が指定された。WORDなので、0x11は0x0011(16ビット)だと解釈される | | 桁が指定された。WORDなので、0x11は0x0011(16ビット)だと解釈される |
| + | |
| + | |
| + | |
| + | ***実際の挙動 [#v35a16ba] |
| + | -8ビット指定 |
| + | |
| + | MOV BYTE [0x0042],0x11 |
| + | |
| + | : ├────┤ : ├────┤ |
| + | 0x40番地 │ 0x32 │ 0x40番地 │ 0x32 │ |
| + | ├────┤ ├────┤ |
| + | 0x41番地 │ 0xA1 │ 0x41番地 │ 0xA1 │ |
| + | ├────┤ ├────┤ |
| + | 0x42番地 │ 0x4F │ ⇒ 0x42番地 │ 0x11 │ ←ここだけ変化 |
| + | ├────┤ ├────┤ |
| + | 0x43番地 │ 0x96 │ 0x43番地 │ 0x96 │ |
| + | ├────┤ ├────┤ |
| + | 0x44番地 │ 0xEF │ 0x44番地 │ 0xEF │ |
| + | ├────┤ ├────┤ |
| + | 0x45番地 │ 0x89 │ 0x45番地 │ 0x89 │ |
| + | ├────┤ ├────┤ |
| + | 0x46番地 │ 0xFF │ 0x46番地 │ 0xFF │ |
| + | : ├────┤ : ├────┤ |
| + | |
| + | |
| + | -16ビット指定 |
| + | |
| + | MOV WORD [0x0042],0x11 |
| + | |
| + | : ├────┤ : ├────┤ |
| + | 0x40番地 │ 0x32 │ 0x40番地 │ 0x32 │ |
| + | ├────┤ ├────┤ |
| + | 0x41番地 │ 0xA1 │ 0x41番地 │ 0xA1 │ |
| + | ├────┤ ├────┤ |
| + | 0x42番地 │ 0x4F │ ⇒ 0x42番地 │ 0x11 │ ←値は16ビットの0x0011と |
| + | ├────┤ ├────┤ 解釈される。値が16ビット |
| + | 0x43番地 │ 0x96 │ ⇒ 0x43番地 │ 0x00 │ ←なのだから0x43も変化する |
| + | ├────┤ ├────┤ |
| + | 0x44番地 │ 0xEF │ 0x44番地 │ 0xEF │ |
| + | ├────┤ ├────┤ |
| + | 0x45番地 │ 0x89 │ 0x45番地 │ 0x89 │ |
| + | ├────┤ ├────┤ |
| + | 0x46番地 │ 0xFF │ 0x46番地 │ 0xFF │ |
| + | : ├────┤ : ├────┤ |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | -32ビット指定 |
| + | |
| + | MOV DWORD [0x0042],0x11 |
| + | |
| + | : ├────┤ : ├────┤ |
| + | 0x40番地 │ 0x32 │ 0x40番地 │ 0x32 │ |
| + | ├────┤ ├────┤ |
| + | 0x41番地 │ 0xA1 │ 0x41番地 │ 0xA1 │ |
| + | ├────┤ ├────┤ |
| + | 0x42番地 │ 0x4F │ ⇒ 0x42番地 │ 0x11 │ ←値は32ビットの0x00000011と |
| + | ├────┤ ├────┤ 解釈される。値が32ビット |
| + | 0x43番地 │ 0x96 │ ⇒ 0x43番地 │ 0x00 │ ←なのだから0x43、0x44、0x45 |
| + | ├────┤ ├────┤ まで変化する |
| + | 0x44番地 │ 0xEF │ ⇒ 0x44番地 │ 0x00 │ ← |
| + | ├────┤ ├────┤ |
| + | 0x45番地 │ 0x89 │ ⇒ 0x45番地 │ 0x00 │ ← |
| + | ├────┤ ├────┤ |
| + | 0x46番地 │ 0xFF │ 0x46番地 │ 0xFF │ |
| + | : ├────┤ : ├────┤ |
| + | |
| + | |
| + | |
| + | *どんな時に桁指定が必要なのか? [#j739aedb] |
| + | -対象(代入する相手)が''レジスタ以外は全部''と考えたほうがわかりやすい。 |