←前ページへ :  INDEX :  次へ→


2-4.メモリーへの転送

  メモリーへの転送(メモリーからの転送)は2種類の方法がある。「直接アドレス法」と「間接アドレス法」である。

2-4-1.直接アドレス法

  直接アドレス法とは、メモリーのアドレスを指定して転送する方法である。例えば、「DATA」という変数にALレジスタの内容を転送したい場合、下記のように書く。
mov DATA,al
  また、決まったアドレスに書き込みたい場合は、下記のように[・・・]で囲う。
mov [1000h],al

  メモリーに即値を代入したい場合はちょっと面倒になる。例えば、変数DATAに、 0を代入したい場合、その0が「00h」(バイト)か「0000h」(ワード)か「00000000h」 (ダブルワード)かアセンブラにはわからないからである。レジスタの場合は、レジスタの大きさがわかっているために、このようなことは起こらない。しかし、メモリー←即値の場合はどの単位なのか指定してやらなければならない。その場合、下記のように「byte ptr」「word ptr」などと指定する。ただしコンパイラの種類によってはどこに「byte ptr」を書くのかに差がある。詳しくはお手持ちのコンパイラのマニュアルを参照してください。
mov byte ptr DATA,0
mov word ptr DATA,0
   or
mov DATA,byte ptr 0
mov DATA,word ptr 0

2-4-2.間接アドレス法

  間接アドレス法とはメモリーのアドレスをレジスタを使って指定する方法を言う。 C言語で言う「ポインタ」である。
mov bx,offset DATA
mov byte ptr [bx],0
   or
mov [bx],byte ptr 0
   or
mov [byte ptr bx],0
  ただし使用できるレジスタは下記のもの(80286以下のCPU)しかも値いることができない。
[BX]、[SI]、[DI」
[BX+SI]、[BX+DI]、[BP+SI]、[BP+DI]
[BX+disp]、[SI+disp]、[DI+disp」
[BX+SI+disp]、[BX+DI+disp]、[BP+SI+disp]、[BP+DI+disp]

  ※disp : 即値


2-4-3.ワード以上の単位の場合の注意

  ワード以上の単位でメモリーに格納する場合、ちょっとした注意が必要になる。 「mov [1000h],word ptr 1234h」とした場合、1000h番地には「34h」が入り、 1001h番地には「12h」が入る。これはx86系CPUの仕様で、他のCPUでは逆になる場合もある。

  また、ダブルワードの場合も同様に逆順に入るため、 「mov [1000h],dword ptr 12345678h」とした場合、1000h番地から 78h,56h,34h,12hと入る。


←前ページへ :  INDEX :  次へ→