17

NASMの例のように、同じことを実現するための特別なGAS構文があるかどうか知りたいです。

SECTION .data       

    msg:    db "Hello World",10,0  ; the 0-terminated string.
    len:    equ $-msg              ; "$" means current address.

$特に、現在の住所を表す記号に興味があります。

4

3 に答える 3

27

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 バージョンです。

于 2012-07-07T12:35:30.860 に答える
7

ここに 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 ディレクティブに代わるものはありません。


于 2012-01-24T13:52:54.903 に答える
5

使用例.

最小限の明示的な例:

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 .
于 2015-10-16T08:09:03.013 に答える