10

アセンブルおよびリンクされたリアル モード プログラムの作成方法を学習しています。

  • GCC アセンブラ バージョン 2.25
  • Binutils バージョン 2.25
  • GCC バージョン 5.2.0

接頭辞を指定せずにIntel構文を使用します.intel_syntax noprefix

文字列のアドレスをSIレジスタにロードしたい。NASMでメモリ位置を参照する方法は知っていますが、GNU Assembler コード内で同じことを行うと、ラベルのアドレスではなく、文字列の WORD のみがレジスタに移動されます。

私のコードは次のとおりです。

.code16
.intel_syntax noprefix

mov cx, 11
mov si, name
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD

GCC でコンパイルすると、デバッガーでプロセッサの動作を確認できます。

mov si, WORD ptr ds:0x7d2d

しかし、文字列が指すデータではなく、文字列のアドレスをレジスタに移動したいのです。

また、次のように名前を角括弧で囲みました。

.code16
.intel_syntax noprefix

mov cx, 11
mov si, [name]
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD

違いはありません。

NASMから、このアセンブリ コードが機能することがわかっています。

mov si, name

NASMnameは、 のアドレスをレジスタSIに移動する命令を生成します。

私の質問:プレフィックスなしの Intel 構文を使用してGCCにシンボルのアドレスをレジスタにロードさせる方法はありますか?

4

1 に答える 1

11

GNU アセンブラー コードを ( GCC経由で) ディレクティブと共に使用している場合:

.intel_syntax noprefix

その場合、構文は少し変わっているように見え、正規のソースでは十分に文書化されていません。このコード:

mov si, name

label が指すメモリ位置にある 16 ビットWORDnameSIに移動します。次の手順は同じことを行いますが、私は角括弧の方が好きで[]コードの意図がより明確であるためです。

mov si, name              
mov si, [name]
mov si, word ptr [name]   # This is the same as two above in long form
                          #     The use of "word ptr" here is similar to MASM

アドレスを取得してレジスタに配置するには、次のようnameに使用する必要があります。offset

mov si, offset name

誰かが使用できる構文を実際に記述している正規.intel_syntax noprefixのソースを持っている場合は、コメントでお知らせください。私は構文に関するブログを知っていますが、軽蔑されていますが、公式なものは何もありません。

于 2016-04-27T19:40:43.820 に答える