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。理想情况下,我想知道为什么我不能在替换语句中使用寄存器扩展后跟捕获组扩展。但替代解决方案也将受到赞赏。

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 回答