MOV命令

Last-modified: 2010-01-21 (木) 19:29:58

MOV命令

 一番基本的で、一番頻繁に使われる命令でデータの複写(「転送/転写する」と表す)を行う。任意の数字をレジスタもしくはメモリーにコピーする。
 ただし、アドレスバスが20bitで、一度にアクセスできるメモリーのアドレスを一つしか指示できないため、メモリーからメモリーに複写はできない。

 MOV命令は2つの引数(オペランド)を指定して使う。実際には以下のようにして使用する。

MOV  DEST,SRC
  動作:DEST←SRC
  影響を受けるフラグ:なし
  DEST:レジスタ、メモリー
  SRC:レジスタ、メモリー、即値

MOV命令で転送できるのは、バイト(8bit)、ワード(2bytes)、ダブルワードとなる。
 MOV AX,BX … BXレジスタの内容をAXに代入せよ
 MOV AL,10 … ALレジスタに10を代入せよ
注意:メモリー間の転送は禁止
   転送元と転送先の大きさは同じ要領の入れ物でないといけない
   セグメント間の転写・セグメントレジスタへ即値の転写はできない

コンパイル

 処理OS(MS-DOS)の実行形式ファイルは全部で3種類。
  ・.bat…バッチファイル。実行したいプログラムをどのような順序で実行するのかを記したテキスト形式のファイル。
  ・.com…マシン語の羅列。扱うセグメントレジスタはすべて同じ値を示し、1セグメント領域しか使用しない。そのため、64kbyteを超えるプログラムは記入できない。参考サイトで使用される形式。
  ・.exe…複数セグメントにわたってプログラムを書くことができ、プログラム本体が書いてあるセグメントでデータを格納するセグメントといった用途によってセグメントを使い分ける。

  • サンプルプログラム
    CODE	SEGMENT
    	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
    	.186
    	ORG	100h
START:
	mov	ah,2
	mov	dl,'A'
	int	21h
	mov	ax,4c00h
	int	21h
	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです

「START:」~「21h」までがプログラム
それ以外は.comファイルを作るための記述(基本的に変更することはない)

CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	.186
	ORG	100h

1行目でセグメント名をCODEと定義し、2行目でDS,CS,ES,SSがCODEセグメントを指すことを指定。
3行目で80186以上のCPUを前提としたコンパイラと指定。.comファイルはセグメント100番地から開始なので4行目を記入。

	ENDS
	END	START

最後2行でプログラムの終了を宣言。

START:
	mov	ah,2

MOV命令。AHレジスタに2を代入

	mov	dl,'A'

Aの文字コードをDLレジスタに代入。

	int	21h

AH=2のとき、21Hを実行するとDLに入っている1文字をディスプレイに表示。
システムコール

	mov	ax,4c00h

AXレジスタに4c00hを代入

	int	21h

AXに4C00hが入っているとAHに4Ch、ALに0が入る。AHに4Chが入っているときにINT、21hを実行するとプログラムを終了。

上記のプログラムをファイル名「××.ASM」で保存。


  • BorlandeのTurbo Assembler
    1.TASM ××.ASM
    2.TLINK /t TEST.OBJ
    を実行エラーが出る場合はプログラムのエラー
  • MASM32
    1.ml/c/Fl test.asm
    2.link/t test.obj,test.com,nul,nul
    link.exeはMASM32に同封されていないので16bitリンカが必要になる。

即値の転送

  • 即値の転送
    定数をレジスタもしくはメモリーに転送すること。C言語でいう変数と代入のような役割。
  • 徳地の転送 例
mov ah,10
AHレジスタに10進数で10を代入
mov ah,10h
AHレジスタに16進数で10を代入
mov ah,10b
AHレジスタに8進数で10を代入
mov ah,'A'
AHレジスタに2進数で10を代入
mov ax,offset DATA
AXレジスタにDATAという変数のアドレスを代入