0

クラスで少し話した後、アセンブリを学ぼうとしています。フィボナッチ数を見つけるための基本的な Java プログラムをアセンブリに変換しようとしています。ロジックは正しいと思いますが、友人は、OS によって ASM が異なるため、Windows 7 64 ビット コンピューターでは動作しない可能性があると教えてくれました ( :O 彼は本気ですか?)

これが私のコードです:

SECTION .data   

Var2: resd 3
Var5: resd 4
Var1: db 10
Var3: db 1
Var4: db 1

SECTION .text   
global main
main:

MOV Var2,0

Loop1:
  ADD Var2,1
  MOV Var5,Var3
  ADD Var3,Var4
  MOV Var4,Var5
  CMP Var2,Var1
  JE Fin
  JP Loop1

Fin:
Put printing in here.

2/ ASM の System.out.print に似たものはありますか?

3/それを理解したら、どのように正確に実行しますか? RadASM を入手しましたが、コードを実行できないようです。完了した ASM プログラムを実行するにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

1
  1. ほとんどすべてのバイナリ実行可能プログラムは、それが書かれたプログラミング言語とは関係なく、OS に依存しています。アセンブリで書かれたプログラムも例外ではありません。バイトコード (Java など) とネイティブ プロセッサ コード (x86-64 など) を混同しないでください。もちろん、使用するプログラミング言語の構文に従う必要があります。メモリ アドレッシングに関連する構文エラーのため、プログラムはほとんどのアセンブラではアセンブルされません。

  2. Windows 7 などのプロテクト モード OS では、印刷に OS API を使用する必要があります。

  3. アセンブリで記述されたプログラムは、他のバイナリ実行可能ファイルとして実行します。まずコードを書き、それをアセンブルしてリンクし、実行します。他のバイナリ実行可能ファイルと同様です。上位レベルのコンパイル済み言語との違いは、アセンブラー (プログラム) にとってアセンブルは、コンパイラー向けの上位レベルのソース コードのコンパイルよりもはるかに簡単なタスクであるということです。

x86-64 アセンブリでは、メモリ アドレスから別のアドレスに直接移動することはできません。最初にプロセッサの汎用レジスタの 1 つを移動し、次にそのレジスタから別のメモリ アドレスに移動する必要があります。ただし、 、 、などmovsb、メモリからメモリに移動する命令もありますが、最初は後で学習する方が簡単です。movswmovsdmovsq

db一部の変数や他の変数に使用する変数のサイズをどのようにするかは明確ではありませんresdVar1すべての , Var2, Var3,をバイトVar4にしたい場合はVar5、たとえば次のようにする必要があります。

Var2: デシベル 3
Var5: デシベル 4
Var1: デシベル 10
Var3: デシベル 1
Var4: デシベル 1

そして、それらをたとえば dwords にしたい場合は、 everydbをに置き換えますddresdは、使用する必要があるバイトを予約するために、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
于 2013-04-17T20:30:37.537 に答える