ほとんどすべてのバイナリ実行可能プログラムは、それが書かれたプログラミング言語とは関係なく、OS に依存しています。アセンブリで書かれたプログラムも例外ではありません。バイトコード (Java など) とネイティブ プロセッサ コード (x86-64 など) を混同しないでください。もちろん、使用するプログラミング言語の構文に従う必要があります。メモリ アドレッシングに関連する構文エラーのため、プログラムはほとんどのアセンブラではアセンブルされません。
Windows 7 などのプロテクト モード OS では、印刷に OS API を使用する必要があります。
アセンブリで記述されたプログラムは、他のバイナリ実行可能ファイルとして実行します。まずコードを書き、それをアセンブルしてリンクし、実行します。他のバイナリ実行可能ファイルと同様です。上位レベルのコンパイル済み言語との違いは、アセンブラー (プログラム) にとってアセンブルは、コンパイラー向けの上位レベルのソース コードのコンパイルよりもはるかに簡単なタスクであるということです。
x86-64 アセンブリでは、メモリ アドレスから別のアドレスに直接移動することはできません。最初にプロセッサの汎用レジスタの 1 つを移動し、次にそのレジスタから別のメモリ アドレスに移動する必要があります。ただし、 、 、などmovsb
、メモリからメモリに移動する命令もありますが、最初は後で学習する方が簡単です。movsw
movsd
movsq
db
一部の変数や他の変数に使用する変数のサイズをどのようにするかは明確ではありませんresd
。Var1
すべての , Var2
, Var3
,をバイトVar4
にしたい場合はVar5
、たとえば次のようにする必要があります。
Var2: デシベル 3
Var5: デシベル 4
Var1: デシベル 10
Var3: デシベル 1
Var4: デシベル 1
そして、それらをたとえば dwords にしたい場合は、 everydb
をに置き換えますdd
。resd
は、使用する必要があるバイトを予約するために、dwords を予約することを意味しますresb
。
アセンブリのオペランドのサイズを知っている必要があります。アセンブラーはユーザーに代わって決定を下しません。
上記のすべての変数がバイト ( db
、それぞれ 8 ビット) であると仮定すると、ループは次のようになります (NASM/YASM 構文):
ループ 1:
ADD [Var2]、バイト 1
MOV al,[Var3]
MOV [Var5],al
mov al,Var4
ADD Var3,al
移動,[Var5]
MOV Var4,al
移動,[Var1]
CMP Var2,al
JEフィン
JPループ1
dd
そして、それらを dwords ( 、それぞれ 32 ビット) にしたい場合:
ループ 1:
ADD [Var2]、dword 1
MOV eax,[Var3]
MOV [Var5],eax
mov eax,Var4
ADD Var3,eax
mov eax,[Var5]
MOV Var4,eax
mov eax,[Var1]
CMP Var2,eax
JEフィン
JPループ1