0

vim を使用してアセンブリ言語ファイルを新しいアセンブラに移植しようとしています。新しいアセンブラは、ローカル ラベルをサポートしていません。そのため、各ローカル ラベルの前にラベル名を挿入しようとしています。ただし、キャプチャ グループが後に続くレジスタを使用しようとすると、「無効な式エラー」が発生します。

入力例:

LABEL_NAME:

        MOV     SP,#STACK_POINTER
        MOV     R7,#12                          ;WAIT LOOP (3)
12$:    MOV     R6,#255                         ;TIME WASTER
11$:    MOV     R5,#255                         ;MUST WAIT !!!!
10$:    RESET_WATCH_DOG
        DJNZ    R5,10$
        DJNZ    R6,11$
        DJNZ    R7,12$

望ましい出力:

LABEL_NAME:

                  MOV     SP,#STACK_POINTER
                  MOV     R7,#12                          ;WAIT LOOP (3)
LABEL_NAME12$:    MOV     R6,#255                         ;TIME WASTER
LABEL_NAME11$:    MOV     R5,#255                         ;MUST WAIT !!!!
LABEL_NAME10$:    RESET_WATCH_DOG
                  DJNZ    R5,LABEL_NAME10$
                  DJNZ    R6,LABEL_NAME11$
                  DJNZ    R7,LABEL_NAME12$

もちろん、これは機能します:

:.,10s/\(\d\+\$\)/LABEL_NAME\1/

ラベル名を registeraにヤンクした後、次のようになります。

:.,10s/\(\d\+\$\)/\=@a/

私にこれを与えます:

LABEL_NAME:

               MOV     SP,#STACK_POINTER
               MOV     R7,#12                          ;WAIT LOOP (3)
LABEL_NAME:    MOV     R6,#255                         ;TIME WASTER
LABEL_NAME:    MOV     R5,#255                         ;MUST WAIT !!!!
LABEL_NAME:    RESET_WATCH_DOG
               DJNZ    R5,LABEL_NAME
               DJNZ    R6,LABEL_NAME
               DJNZ    R7,LABEL_NAME

でもこれは:

:.,10s/\(\d\+\$\)/\=@a\1/

これだけを生成します:

E15: Invalid expression: @a\1

gVim 7.3 を使用しています。理想的には、replace ステートメントでレジスター展開の後にキャプチャー・グループ展開を使用できない理由を知りたいです。しかし、代替ソリューションも高く評価されます。

4

1 に答える 1

3

差し替え部分で表現する場合は、ハイブリッド表現ではなく、全体で表現する必要があります。これはうまくいくはずです:

:.,10s/\(\d\+\$\)/\=@a . submatch(1)/g

簡単な説明:

\=          " the replacement will be expression
@a          " read the value from register 'a'
.           " the string concatenation
submatch(x) " (function) get the matched group from your :s command, x=0,1,2...

お助けアイテム:

:h :s
:h submatch()
于 2013-04-11T20:33:57.440 に答える