章V
予備
【BXが】同様のメモリユニット、BXのオフセット、DSのセグメントアドレスを表します
レジスタまたはメモリユニットの内容を示すために、我々記述記号()
(AX)は、メモリユニットの内容を表す斧、(20000H)の内容を示す20000H
((DS)* 16 +(BX))、範囲BXでDS ADR1、ADR2コンテンツの内容は、それが指示ADR1ある:コンテンツユニットADR2
(2000:0)、((DS):1000H)は、正しい使い方ではありません
いくつかの特定のアプリケーション
MOV斧、[2](AX)=((DS)* 16 + 2)として説明することができます
プッシュ斧は(SP)=(SP)-2((SS)×16 +(SP))=(AX)として記述することができます
操作や特定のレジスタ名の種類によって決定されるバイトまたはワード、2つのタイプで表されるデータ(X)
(アル)(BL)フォントのバイト(DS)(AX)であります
5.1 [BX]
inc bx ;bx自增
mov [bx],ax ;传入一个字,[bx]后一个单元也被赋值
mov [bx],al ;传入一个字节
5.2ループ命令
CPUは、命令ループ、最初の(CX)を実行する際=(CX)-1、次いで決意値CXがゼロでない場合、ラベルのプログラムの実行に進み、サイクル数CXに格納されて、ゼロまで行われます、
例:計算2 ^ 12
assume cs:code
code segment
mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00H
int 21H
code ends
end
次のようにサイクルフレーム
mov cx,循环次数
s:
循环执行的程序段
loop s
123 * 236、123プラス一つは236で加算を計算することによって実現され、他は明らかに高速であり、235プラス123であります
assume cs:code
code segment
mov ax,0
mov cx,123
s:add ax,236
loop s
mov ax,4c00H
int 21H
code ends
end
命令デバッグのプログラムループで実現5.3追跡ループ
問題は、計算FFFFを考慮してくださいユニット3乗算結果の0006数DXに格納されます。
図1に示すように、スコープDXを超える演算の結果を記憶することができるかどうか?
255 * 3 <65535ません
2、FFFF:値AXを割り当て0006単位は、バイト単位、AXレジスタは16ビットの長さである(DX)=(DX)+(AX)が、FFFF :. 6で3回DX同様に、どのように割り当て?
MOV斧、[6]に代入FFFF場合場合:0006含量が低い斧で送信され、FFFF:0006単位:0007サイズ= FFFFを作るために高い斧、斧値の内容に送信されます同じ大きさの値が、私たちはああ= 0を作ってみます
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax
mov bx,6 ;ds:bx
mov al,[bx]
mov ah,0 ;使得大小上相等
mov dx,0
mov cx,3
s:add dx,ax
loop s
mov ax,4c00H
int 21H
code ends
end
最初の命令、という注意アセンブラソースプログラムは、文字で始まるいないデータは、その前に0を追加するため、A000Hは、アセンブラソースプログラム0A000Hで書かれました
デバッグでは、ループのループのアドレスがループ0012と呼ばなります
CSから仮定するサイクルブロック:0012スタート、コードは、ステップを実行しない前に、G 0012を使用することができ、デバッグ現在CSから:IP開始命令を指すようになるまで(IP)= 0012H
あまりにも多くのサイクルが、命令のループpコマンドの場合に再度使用することができる場合、CXが0になるまで、自動的にループの残りの部分を実行し、(CSを想定:1006は命令の次のループのアドレスである)G 1006にも使用することができます
5.4デバッグと命令MASMの異なる処理
したがって、AXに0データが、アセンブラソースプログラムでは、命令MOV斧は、[0]コンパイラディレクティブMOV斧、0処理として扱われる:デバッグMOV斧のライトコマンドは、[0]は、DSを示しますあなたは2000にしたい場合:[BX]の方法による細胞アルに0データを、アクセスメモリユニットに
mov ax,2000H
mov ds,ax
mov bx,0
mov al,[bx]
しかし、これは、我々は、セグメントを与えるためにショーを取るので、非常に面倒である方法セグメントアドレスを登録します
mov ax,2000H
mov ds,ax
mov al,ds:[0]
要約:ディスプレイの前にIdataを定数は、セグメントレジスタ、またはMASMを与えられる必要があるように[...] [Idataが】Idataとするように解釈、場合[...]レジスタに、DSの既定のセグメントのアドレスは、もちろん、表示されなければなりませんセグメント所与のセグメント・レジスタ・アドレスが配置されています
5.5ループとの組み合わせの[BX]
計算FFFF:0〜FFFF:B部及びデータは、結果がDXに格納されます。
演算結果を格納する範囲のDXを超えてではなく、FFFFできない:0〜FFFF:直接DXに蓄積Bデータ、旧データが8ビットであるので、長さが一致していないが、(累積DL場合DH)= 0、おそらくキャリーの損失を引き起こすことがあり、行うには、仲介と16ビットのレジスタです
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax
mov bx,0
mov dx,0
mov cx,12 ;0~b 一共12次
s:mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
5.6セグメントプレフィックス
mov ax,ds:[bx]
mov ax,cs:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
mov ax,ss:[0]
mov ax,cs:[0]
DS:CS:SS:ES:アセンブリ言語でセグメントプレフィックス
5.7安全なスペース
8086モードでは、メモリ空間のメモリ部へのランダム書き込みは非常に危険です、このメモリは、重要なデータやコードを有することができます
我々はメモリ空間にデータを書き込む必要がある場合は、オペレーティング・システムは、私たちに割り当てられたスペースを使用するには
DOSモードでは、通常、0:200〜0:必要なデータは、このスペースの使用に、メモリに書き込まれている場合、システムまたは他のプログラムデータやコードのスペース、2FF
5.8使用セグメントプレフィックス
メモリのFFFF:FFFF 0・:Bコピー・データ・ユニット〜0:200〜0:20bの単位
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,12
s:mov dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end