Assembly 1:在汇编语言中是什么意思?
我正在读RISC-V测试模式的源代码。 riscv test.h中有一个宏定义 我想知道Assembly 1:在汇编语言中是什么意思?,assembly,gnu-assembler,riscv,Assembly,Gnu Assembler,Riscv,我正在读RISC-V测试模式的源代码。 riscv test.h中有一个宏定义 我想知道1:在该代码中的含义: #define RVTEST_CODE_BEGIN \ .section .text.init; \ .align 6;
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:
是本地符号名;这只是一个标签。从:
本地符号名称
本地符号帮助编译器和程序员临时使用名称。
它们创建的符号保证在整个过程中是唯一的
输入源代码的范围,可由
简单的符号。要定义局部符号,请编写表单的标签
N:(其中N表示任何正整数)。指最
最近以前对该符号的定义使用相同的
定义标签时的编号。参考下一个定义
对于本地标签,写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:
这是一种定义和引用本地标签的方便方法,无需在任何地方想出唯一的名称
这是:
在这里,我们看到标签被引用为
2f
,1b
,等等。我已经有一段时间没有编写任何asm代码了,但是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 \