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という変数のアドレスを代入