Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 1:在汇编语言中是什么意思?_Assembly_Gnu Assembler_Riscv - Fatal编程技术网

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

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;

我正在读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:
是本地符号名;这只是一个标签。从:

本地符号名称

本地符号帮助编译器和程序员临时使用名称。 它们创建的符号保证在整个过程中是唯一的 输入源代码的范围,可由 简单的符号。要定义局部符号,请编写表单的标签 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 \