10

x86 インライン アセンブリ プログラミングについて学習しています。

を書きたかったmov ecx, FFFFFFBBのですが、コンパイラが認識しません。そのような 16 進数は、インライン アセンブラ コードではどのように記述すればよいですか?

4

4 に答える 4

20

それはあなたのアセンブラのフレーバーに依存します。

  • AT&T:movl $0xFFFFFFBB, %ecx
  • インテル:mov ecx, 0FFFFFFBBh

参考までに、AT&T 構文はGNU Assemblerなどのアセンブラーで使用されますが、NASMやその他のほとんどは Intel の構文を使用します。

于 2012-07-31T07:20:39.877 に答える
13

アセンブラーのマニュアルやその他の多くのものへのリンクについては、 タグ wiki を参照してください。


さまざまな x86 アセンブラーが、16 進定数の次の構文のいずれかまたは両方をサポートしています。

  • 0xDEADBEEF: NASM (および互換)、GNUasFASM、MSVC インライン asm ( MASM を除く)、emu8086。
  • 0DEADBEEFh: NASM (および互換)、FASM、MASM、TASM、emu8086。

DOS/Windows のみのアセンブラは、多くの場合、...h構文のみをサポートします。
移植可能なアセンブラは通常、0x...構文またはその両方をサポートします。

先頭の0: 数値定数は、シンボル名と区別するために常に 10 進数で始める必要があります。 ( masm コードで文字で開始された 16 進数をどのように書くのですか?は、末尾の h スタイルについて、特にそれについてです。)

また、アセンブラは、C コンパイラと同様に、アセンブル時に式を評価できるため、foo & 0xF(iffooがアセンブラ定数であり、foo equ 0xABCまたは何かで定義されている場合) を記述できることに注意してください。ラベル (アセンブル時ではなくリンク時定数) を追加/減算することもできるため、32 ビットの即値が異なるだけで、mov-immediate 命令にmov eax, OFFSET label - 20アセンブルされるようなものです。mov r32, imm32


定数に関するNASMマニュアルのセクションから:

いくつかの例 (すべてまったく同じコードを生成します):

    mov     ax,200          ; decimal 
    mov     ax,0200         ; still decimal 
    mov     ax,0200d        ; explicitly decimal 
    mov     ax,0d200        ; also decimal 
    mov     ax,0c8h         ; hex 
    mov     ax,$0c8         ; hex again: the 0 is required 
    mov     ax,0xc8         ; hex yet again 
    mov     ax,0hc8         ; still hex 
    mov     ax,310q         ; octal 
    mov     ax,310o         ; octal again 
    mov     ax,0o310        ; octal yet again 
    mov     ax,0q310        ; octal yet again 
    mov     ax,11001000b    ; binary 
    mov     ax,1100_1000b   ; same binary constant 
    mov     ax,1100_1000y   ; same binary constant once more 
    mov     ax,0b1100_1000  ; same binary constant yet again 
    mov     ax,0y1100_1000  ; same binary constant yet again

ほとんどのアセンブラでは、ASCII ゼロなどの文字リテラルも使用できます。'0'または'0123'、32 ビット整数にパックされた 4 つの ASCII 桁の場合でも。エスケープ シーケンス ( \n') をサポートするものもあれば、サポートしないもの (YASM など) もあります。NASM は、二重引用符ではなく、逆引用符内のエスケープ シーケンスのみをサポートします。


その他のプラットフォーム:

ARM アセンブラ:0xDEADBEEF動作します。

0x... が典型的だと思います。0...h は主に DOS のものです。

于 2016-05-11T03:14:23.910 に答える
2

アセンブラによって異なりますが、16 進リテラルの一般的な表記法は0FFFFFFBBh.

于 2012-07-31T05:35:28.923 に答える
1

通常、16 進数は先頭0xに を付けて表すので、 を使用します0xFFFFFFBB

于 2012-07-31T05:35:19.087 に答える