NASMの例のように、同じことを実現するための特別なGAS構文があるかどうか知りたいです。
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
$
特に、現在の住所を表す記号に興味があります。
NASMの例のように、同じことを実現するための特別なGAS構文があるかどうか知りたいです。
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
$
特に、現在の住所を表す記号に興味があります。
info as
(GNU Binutils 2.21.90)からの抜粋、または GAS マニュアルのオンライン: https://sourceware.org/binutils/docs/as/Dot.html
5.4 特別なドット記号
特殊記号は、アセンブル
.
先の現在のアドレスを参照します。as
したがって、式は独自のアドレスを含むようにmelvin: .long .
定義 します。melvin
に値を代入すると、ディレクティブ
.
と同じように扱われます。.org
したがって、この表現.=.+4
は、と言っているのと同じ.space 4
です。
msg: .ascii "Hello World!\n" # not zero-terminated, use .asciz for that
msglen = . - msg # A .equ directive would be equivalent
これは、アセンブラに何かの長さを計算させるために NASM ( len equ $ - symbol
)で使用されるのと同じイディオムの GAS バージョンです。
ここに Gas と NASM の便利な比較があります: http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html
特にこの部分を参照してください。これはあなたの質問に対処していると思います:
リスト 2 では、ロケーション・カウンターの概念も紹介しています (6 行目)。NASM は、ロケーション カウンターを操作するための特別な変数 ($ および $$ 変数) を提供します。GAS では、ロケーション カウンターを操作する方法がなく、ラベルを使用して次の格納場所 (データ、命令など) を計算する必要があります。たとえば、文字列の長さを計算するには、NASM で次のイディオムを使用します。
prompt_str db 'Enter your name: '
STR_SIZE equ $ - prompt_str ; $ is the location counter
$ はロケーション カウンターの現在の値を示し、このロケーション カウンターからラベル (すべての変数名はラベルです) の値を引くと、ラベルの宣言と現在のロケーションの間に存在するバイト数が得られます。equ ディレクティブは、変数 STR_SIZE の値をそれに続く式に設定するために使用されます。GAS での同様のイディオムは次のようになります。
prompt_str:
.ascii "Enter Your Name: "
pstr_end:
.set STR_SIZE, pstr_end - prompt_str
終了ラベル (pstr_end) は次のロケーション アドレスを示し、開始ラベル アドレスを差し引くとサイズが得られます。また、.set を使用して、変数 STR_SIZE の値をコンマに続く式に初期化することにも注意してください。対応する .equ も使用できます。NASM には、GAS の set ディレクティブに代わるものはありません。
使用例.
最小限の明示的な例:
x: .long .
mov x, %eax
mov $x, %ebx
/* eax == ebx */
文字列の長さの一般的な組み合わせ:
s: .ascii "abcd"
s_len = . - s
mov $s_len, %eax
/* eax == 4 */
s_len =
Is there a difference between equals sign assignment "x = 1" and ".equ x, 1" or ".set x, 1" in GNU Gas assembly? で説明されている構文
これは、実行可能な最小限の x86 Linux フリースタンディングの例などで具体的に使用できます。
無限ループ:
jmp .