4

私はこれにうんざりしています。しばらくの間、アセンブリを把握しようとしてきましたが、言語ではなくコンパイラに向かってコーディングしているように感じます。

私はこのチュートリアルを使用してきましたが、これまでのところ地獄です。私はNASMを使用していますが、これが問題かもしれませんが、それが最も人気のあるものだと思いました. 最も一般的なアセンブリ形式を学ぼうとしているだけなので、x86 を学ぶことにしました。変数をインクリメントできないなど、愚かなエラーが発生し続けます。最新のものは次のとおりです。divを使用できないことです。

mov bx, 0;
mov cx, 0;
jmp start;
 start:
 inc cx;
 mov ax, cx;
 div 3; <-- invalid combination of opcode and operand
 cmp ah,0;
 jz totalvalue;
 mov ax, cx;
 div 5; <-- invalid combination of opcode and operand
 cmp ah, 0;
 jz totalvalue;
 cmp cx, 1000;
 jz end;

 totalvalue:
 add bx,cx;
 jmp start;

jmp end;
 end:
   mov ah,4ch;
   mov al,00;
   int 21h;

コンパイラを変更する必要がありますか? 分割が標準のようです。2 つのチュートリアルを読む必要がありますか (1 つは NASM に関するもので、もう 1 つは x86 に関するものですか?)。この問題に関する具体的なヘルプはありますか?

4

5 に答える 5

10

このように考えてください。x86アーキテクチャは実際にはマシンコードしか理解しません。NASMなどのアセンブラは、アセンブリからマシンコードに変換します。したがって、アセンブラの選択は、適切な変換(NASMが行う)を実行している限り、実際にはそれほど重要ではありません。

javacこれは、Eclipseの組み込みコンパイラを使用するかどうかの問題に類似しています。どちらも有効なJavaをコンパイルします。アセンブラもいくつかの追加のマクロなどをサポートしていることを理解していますが、この状況では当てはまらないようです。

さらに、NASMサイト自体は、x86アセンブリに関するIntelのドキュメントを示しているだけなので、特別な形式を期待していないことを確認できます。

さて、私はこのサイトがDIV命令を文書化しているのを見つけました、そしてそれはこう言っています:

80x86除算命令は、64/32除算(80386以降のみ)、32/16除算、または16/8除算を実行します。これらの手順は次の形式を取ります。

            div     reg     For unsigned division
            div     mem

            idiv    reg     For signed division
            idiv    mem

            aad             ASCII adjust for division

だからそれはあなたのエラーを説明するでしょう。の引数divはレジスタまたはメモリの場所にすることができますが、定数を指定しています。

于 2010-05-20T14:37:50.163 に答える
7

Intelは即時引数(レジスタとメモリのみ)をサポートしていないため、div使用しているチュートリアルはすべて非標準のアセンブラ用に構築されています。

于 2010-05-20T14:41:24.620 に答える
5

他の言語と同様に、アセンブリに関することの1つは、アセンブリが部分的にアセンブラによって定義されることです。その「div5」は私にはひどく奇妙に思えますが、構文が異なるMASMを使用してアセンブリを学習しました。チュートリアルのコメントに基づくと、そのチュートリアルで使用されているアセンブラには、命令に「暗黙の」オペランドがいくつかあるように見えますが、NASMにはないようで、div命令にIntel構文が必要です。

私見ですが、NASMを使用するのが最適ですが、NASM固有のチュートリアル、または「純粋な」Intel構文に合わせたチュートリアルを入手できます。Art of Assemblyの本は、Intel構文の優れたリソースです。

(編集:上記のリンクが失敗した場合は、これを試しください。これは、上記のリンクが転送される場所です)

于 2010-05-20T14:40:11.520 に答える
1

うーん、あなたはアセンブラコンパイラの別の方言を使用しています...マニュアルには、シェアウェアアセンブラパッケージであるA86アセンブラが明確に記載されています(かなり前のことです!!!)あなたの最善の策はチェックすることです代わりにいくつかのnasmチュートリアルを出しましたが、ちなみにここに最高のnasmチュートリアルについての質問が投稿されました。

x86アセンブラーは、GAS、NASM、A86、TASM、MASMなど、使用しているものに関係なく、すべて一般的に同じです。余分な構文糖を持っているものもあれば、持っていないものもあります...

于 2010-05-20T14:38:36.747 に答える