我正在阅读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; \
答案 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:
。
这是一种定义和引用本地标签的便捷方式,无需在任何地方想出唯一的名称。
#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 \
我们看到标签被引用为2f
,1b
等