アセンブリ言語の注意事項(3)

1.命令:
mov:
1レジスタに直接データを
送信する2 あるレジスタの内容を別のレジスタに
送信する3メモリユニットの内容をレジスタに送信する:
mov al、[0]->(ax) =((ds)* 16 + 0)
mov ax、[bx]-> bxに保存されたデータをオフセットアドレスEAとして使用し、セグメントアドレスSAはデフォルトでdsになり、SAでデータを送信:EAからax中、すなわち(ax)=((ds)* 16 +(bx))

jmp:
変更cs:ip
jmp 2AE3:3-> cs = 2AE3H ip = 0003H
jmp ax- > mov IP、ax(そのような使用法はありません)
jmp short s->ラベルに移動してコマンドを実行します(転送をマーク距離)(8ビット変位)
jmp near ptr->上記と同様(16ビット変位)
jmp far ptr label->セグメント間の遷移(csを変更:セグメントアドレスとオフセットアドレスでip)
jmp word ptr ds:[ 0]->(セグメント内転送)
jmp dword ptr ds:[0]->(セグメント間転送)上位アドレスはセグメントアドレス、下位アドレスはオフセットアドレス

プッシュ
ポップ

sub:
sub ax、ax-> clear ax [2 bytes]-> mov ax、0 [3 bytes]

inc:
コンテンツと1つの
mov bx、1
inc bx-> bx = 2

loop:
1.cx--
2.ゼロでない場合は、ラベルにジャンプしてプログラム
mov cx、11
s を実行します。addax 、ax
loop s

and:
論理と命令、ビットごとのAND演算
mov al、01101110B
およびal、01001010B-> al = 01001010B
または:
ビットごとのOR演算(上記と同じ)

div:
除算命令:
div byte ptr ds:[0]->(al)=(ax)/((ds)* 16 + 0)商、(ah)=剰余->除数8ビット被除数16ビット
divワードptr es:[0]->(ax)=((dx)* 10000H +(ax))/((es)* 16 + 0)商、(dx)=剰余->除数16ビット、被除数32ビット

db / dw:
db(dbyte)はバイトデータ(8ビット)を定義し、dwはワードデータ(16ビット)を定義します
擬似命令dd(ddoubleword):
ダブルワードダブルワードデータ-> dd 1-> 2つを占有ワード(32ビット)

演算子dup:
db 3 dup(0)-> 3バイトを定義、値は0
db 3 dup(0,1,2)-> 9バイトを定義、012012012
db / dw / dd繰り返し回数dup(重複データ)

オペレーターのオフセット(コンパイラー処理):
ラベルのオフセットアドレスを取得->開始:mov ax、オフセット開始-> mov ax、0

nopのマシンコードは1バイトを占めます

jcxz:
条件付き分岐命令-> jcxzラベル(cx = 0が実行するラベルに転送される場合、!= 0は下向きに実行されます)

ret、retf:
転送命令
ret:(IP)=((ss)* 16 +(sp))
(sp)=(sp)+
2- > pop IP retf:(IP)=((ss)* 16 + (sp))
(sp)=(sp)+2
(CS)=((ss)* 16 +(sp))
(sp)=(sp)+ 2-> pop CS pop IP

call:
現在のIPまたはCSとIPをスタックに
プッシュしますTransfer-> callラベル(現在のIPをスタックにプッシュし、ラベルにジャンプして命令を実行します)
call far ptr label-> transfer between segment
16-bit reg
call word ptrメモリユニットアドレス
コールdword ptr
call + retでサブルーチンを形成

MUL:
8つのバイト単位又はメモリ内の8ビットで乗算命令別* 8ビットらREG
- >でAXの結果
16ビットワードまたはメモリユニットのREGに別のAXの16ビットが16ビット*
- >結果上位ビットがdx下位ビットがax
mul reg / mulメモリユニット
mulバイトptr ds:[0]

表記法シンボルidataは定数を意味します(即値->アセンブリ命令で直接指定された数)

2.レジスタ
reg(レジスタ)、sreg(セグメントレジスタ)
reg = {ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di}
sreg = {ds、ss、cs、es}

ax:
ah
al
bx
cx
保存されたプログラムの長さ
dx

SI、DIは2つの8ビットレジスタに分割することができる

CS
IP
命令実行の内容と指摘されている:[IP CS]は、
例:[M:N] M×16 + Nユニットからは最初の命令読み出して実行を開始
DSレジスタを:
セグメントレジスタ、データを直接渡すことはできません
。movds、bx
dsのアドレスを、メモリユニットの
esレジスタのセグメントアドレスとして使用できます
か?セグメントレジスタ?

ss:
いつでもsp SS:SPは

スタックの一番上の要素を指します

4.
デバッグの使用:mov ax、[0]命令デバッグとmasm解釈の違い
デバッグはメモリユニットとして解釈されますが、masmコンパイラはidata(定数)
ソリューションとして解釈されます。最初にレジスタにアドレスを渡してから使用します[bx]
またはds と同様の方法でメモリにアクセスします:[0]-> mov al、[0]-> mov al、ds:[0]
-r:
レジスターの内容を表示および変更します
-r ax modify axデータは、
-d:
(16進表示メモリ)メモリ内容表示
1000年-d:0 [アドレスセグメント:オフセットアドレス]
次にコマンドリストD次コンテンツの
-e:
メモリ内容を書き換えます
- e 1000:0 0 1 2 3 4 5 'a' .....
-u:
マシンコードの意味をチェック(逆アセンブリ)
-t:
メモリ内のマシンコードを実行(実行の追跡)
-a:
マシンコードを書き込む
ごとのアセンブリ

-p:
1. pコマンドを使用してint 21Hを実行
します2. pコマンドを使用してループを自動的に実行します
-g:
プログラム
をgに直接実行します0016-> cs:0016
-q:
exit debug

5.ソースプログラム:
csを想定:コードg
codesgセグメント

mov ax、0123H
mov bx、0456H
add ax、bx
add ax、ax

mov ax、4c00H
int 21H //実装プログラムは、pを使用して

codegを終了します

end end
programming(edit)-> 1.asm-> compile (Masm)-> 1.obj-> link(link)-> 1.exe-
> load(command)-> program in

memory- > run debug 1.exe

6.アセンブリ
セーフスペース:0:20​​0〜0:2ff(00200h-002ffh)
デバッグを使用してすべて0かどうかを確認し、

オペレーティングシステムを操作してメモリスペースを割り当てることができます
dwで
定義されたdw 0123h、0456h、0789h、0abch データコードセグメントの先頭に配置-> CS:0位置
startを
使用して、プログラムのエントリを示すことができます-> start- > end start コードセグメントのスタックを使用:dw 0,0,0,0,0,0、 0,0,0,0,0,0,0,0,0,0(オープンスペース)

、mov ax、cs
mov ss、ax
mov sp、30h を使用してスタックとして16のフォントデータを定義します->スタックの一番上に置くss:spはcs:30hを指し
、コード、データ、およびスタックを異なるセグメントに配置します:
cs:code、ds:data、ss:スタック
データセグメント
dw 0123h、0456h ......
データは
スタックセグメント
dw 0を終了します、 0,0,0,0 .....
スタック終了
コードセグメント.....-
> mov ax、data
メモリアドレスを定義するより柔軟な方法のために、dataという名前のセグメントアドレスがaxに送信されます。または。
[bx + idata]->オフセットアドレスbx + idata
例:mov ax、[200 + bx]

文字の形式でデータを指定します:(ascii)
'xxxx'
mov al、 'x'-> mov al、61H
db 'unIX'-> db 75H、6EH、49H、58H

ダブルループループでは、cxのデータを処理前のbx
またはメモリに保存できます。通常、

メモリユニットの[...]で使用できるのは、スタック内のbx、si、di、およびbpのみです。アドレッシング(8086cpu)
bpが[...]で使用されている限り、セグメントアドレスは明示的に指定されず、セグメントアドレスはデフォルトで
smov mov、[bp]->(ax)=((ss)* 16+(bp))

セグメントアドレス(SA)およびオフセットアドレス(EA)->デフォルトのセグメントアドレスds、ss

ワード操作とバイト操作:
ワード操作は通常axタイプ、バイト操作は通常タイプ
word ptr / byte ptr:
mov word ptr ds:[0]、1->は、命令によってアクセスされるメモリユニットがワードであることを示します。 Unit
mov byte ptr ds:[0]、1->は、アクセスされるメモリユニットがバイトユニットであることを示します
(ワードユニットは2バイトユニットです)。

7.その他の1
バイト= 8ビット-> 8桁の2桁1
バイト-> 2桁の16進数
格納、および/または大文字と小文字を変更(ビット演算)

おすすめ

転載: www.cnblogs.com/mzi-mzi/p/12731539.html