x86 インライン アセンブリ プログラミングについて学習しています。
を書きたかったmov ecx, FFFFFFBB
のですが、コンパイラが認識しません。そのような 16 進数は、インライン アセンブラ コードではどのように記述すればよいですか?
x86 インライン アセンブリ プログラミングについて学習しています。
を書きたかったmov ecx, FFFFFFBB
のですが、コンパイラが認識しません。そのような 16 進数は、インライン アセンブラ コードではどのように記述すればよいですか?
それはあなたのアセンブラのフレーバーに依存します。
movl $0xFFFFFFBB, %ecx
mov ecx, 0FFFFFFBBh
参考までに、AT&T 構文はGNU Assemblerなどのアセンブラーで使用されますが、NASMやその他のほとんどは Intel の構文を使用します。
アセンブラーのマニュアルやその他の多くのものへのリンクについては、 x86タグ wiki を参照してください。
さまざまな x86 アセンブラーが、16 進定数の次の構文のいずれかまたは両方をサポートしています。
0xDEADBEEF
: NASM (および互換)、GNUas
、FASM、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
いくつかの例 (すべてまったく同じコードを生成します):
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 のものです。
アセンブラによって異なりますが、16 進リテラルの一般的な表記法は0FFFFFFBBh
.
通常、16 進数は先頭0x
に を付けて表すので、 を使用します0xFFFFFFBB
。