1:汇编语言是什么意思?

时间:2016-09-11 02:10:05

标签: assembly gas riscv

我正在阅读RISC-V测试模式的源代码。 在riscv-test.h中有一个宏定义,

我想知道1:在此代码中的含义:

#define RVTEST_CODE_BEGIN                                               \
        .section .text.init;                                            \
        .align  6;                                                      \
        .weak stvec_handler;                                            \
        .weak mtvec_handler;                                            \
        .globl _start;                                                  \
_start:                                                                 \
        /* reset vector */                                              \
        j reset_vector;                                                 \
        .align 2;                                                       \
trap_vector:                                                            \
        /* test whether the test came from pass/fail */                 \
        csrr t5, mcause;                                                \
        li t6, CAUSE_USER_ECALL;                                        \
        beq t5, t6, write_tohost;                                       \
        li t6, CAUSE_SUPERVISOR_ECALL;                                  \
        beq t5, t6, write_tohost;                                       \
        li t6, CAUSE_MACHINE_ECALL;                                     \
        beq t5, t6, write_tohost;                                       \
        /* if an mtvec_handler is defined, jump to it */                \
        la t5, mtvec_handler;                                           \
        beqz t5, 1f;                                                    \
        jr t5;                                                          \
        /* was it an interrupt or an exception? */                      \
  1:    csrr t5, mcause;                                                \
        bgez t5, handle_exception;                                      \
        INTERRUPT_HANDLER;                                            \  

1 个答案:

答案 0 :(得分:5)

1:是本地符号名称;它只是一个标签。来自gas manual

  

本地符号名称

     

本地符号可帮助编译器和程序员临时使用名称。   他们创造的符号在整个过程中保证是独一无二的   输入源代码的范围,可由a引用   简单的表示法。要定义本地符号,请写入表单的标签   N :(其中N代表任何正整数)。最多参考   最近以前定义的那个符号写Nb,使用相同的   定义标签时的数字。参考下一个定义   一个本地标签,写Nf - b代表“向后”和f   代表“前锋”。

     

对于如何使用这些标签没有限制,您可以   重用它们。因此可以重复定义相同的内容   本地标签(使用相同的数字N),虽然你只能参考   最近定义的该号码的本地标签(用于向后   参考)或a的特定本地标签的下一个定义   前向参考。值得注意的是,前10名当地人   标签(0:... 9 :)以稍微有效的方式实现   比其他人。

     

以下是一个例子:

1:        jra 1f 
2:        jra 1b 
1:        jra 2f 
2:        jra 1b
     

相当于:

label_1:  jra label_3 
label_2:  jra label_1 
label_3:  jra label_4
label_4:  jra label_3 
     

本地符号名称只是一种符号设备。   它们立即转变为更传统的符号名称   在汇编程序使用它们之前。 ...

在您的示例中,标签之前引用了一些指令:

beqz t5, 1f;

1f表示“名为1的下一个标签”,只是跳转到1:

这是一种定义和引用本地标签的便捷方式,无需在任何地方想出唯一的名称。

这是another example

#define TEST_JR_SRC1_BYPASS( testnum, nop_cycles, inst ) \
test_ ## testnum: \
    li  TESTNUM, testnum; \
    li  x4, 0; \
1:  la  x6, 2f; \
    TEST_INSERT_NOPS_ ## nop_cycles \
    inst x6; \
    bne x0, TESTNUM, fail; \
2:  addi  x4, x4, 1; \
    li  x5, 2; \
    bne x4, x5, 1b \

我们看到标签被引用为2f1b