【问题标题】:What does 1: mean in assembly language?1:在汇编语言中是什么意思?
【发布时间】:2016-09-11 02:10:04
【问题描述】:

我正在阅读 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;                                            \  

【问题讨论】:

  • 我已经有一段时间没有写任何 asm 代码了,但是 1: 对我来说确实像是一个标签。
  • 具体是本地标签。你可以在这里阅读更多关于它们的信息:sourceware.org/binutils/docs-2.24/as/…

标签: assembly gnu-assembler riscv


【解决方案1】:

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

本地符号名称

本地符号帮助编译器和程序员临时使用名称。 他们创建的符号保证在整个过程中都是唯一的 输入源代码的范围,可以由 简单的符号。要定义一个局部符号,写一个形式的标签 N:(其中N代表任何正整数)。参考最 最近之前对该符号的定义写为 Nb,使用相同的 定义标签时的编号。参考下一个定义 本地标签的,写 Nf - b 代表“向后”,而 f 代表“前锋”。

对于如何使用这些标签没有任何限制,您可以 也可以重复使用它们。所以可以重复定义相同的 本地标签(使用相同的数字N),虽然你只能参考 该数字的最近定义的本地标签(用于向后 参考)或特定本地标签的下一个定义 前向参考。还值得注意的是,前 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 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2017-08-28
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多