Assembly &引用;auipc目的地,标签;(和“la dest,label”)don';无法生成预期的列表

Assembly &引用;auipc目的地,标签;(和“la dest,label”)don';无法生成预期的列表,assembly,riscv,Assembly,Riscv,我正在尝试为RISC-V编写一个汇编代码(尽管这是第一次为RISC-V编写汇编代码) 我为其他几个CPU编写了代码),而我在清单中看到的与此不同 我期望的是:我正在尝试使用“ladest,label”加载地址 将标签插入寄存器中,稍后用作指针。但是, 清单1显示了PC相对偏移量的值为零。 当我插入“j标签”指令只是为了测试汇编程序时,我看到 具有正确值的指令偏移字段。好像“auipc” 说明不正确(或者我犯了一些初学者的错误) 我正在使用“binutils-2.28”的汇编程序,它是为 “ris

我正在尝试为RISC-V编写一个汇编代码(尽管这是第一次为RISC-V编写汇编代码) 我为其他几个CPU编写了代码),而我在清单中看到的与此不同 我期望的是:我正在尝试使用“ladest,label”加载地址 将标签插入寄存器中,稍后用作指针。但是, 清单1显示了PC相对偏移量的值为零。 当我插入“j标签”指令只是为了测试汇编程序时,我看到 具有正确值的指令偏移字段。好像“auipc” 说明不正确(或者我犯了一些初学者的错误)

我正在使用“binutils-2.28”的汇编程序,它是为 “riscv32”

以下是汇编程序代码:

.section .text
.globl _start
_start:


.equ    MON_OUT_ADDR,                   0x00000000      #       TBD
.equ    MON_BASE_ADDR,                  0x12345678      #       TBD

.equ    MON_OUT_ADDR_OFFSET,                    0x0
.equ    BASE_ADDR_OFFSET,                               0x4



#.org 0x0                                                                               #       TBD.
mon_isr:

        j       isr_data                                                #       <=== Dummy instruction, just to test riscv32-as
        la              x1,isr_data                                     #       x1 - ISR data ptr.

        la              x1,wfi_endless_loop                     #       <=== Dummy instruction, just to test riscv32-as
        lui             x1,%hi(isr_data)                        #       <=== Dummy instruction, just to test riscv32-as
        auipc   x1,%pcrel_hi(isr_data)          #       <=== Dummy instruction, just to test riscv32-as
        addi    x1,x1,%lo(isr_data)                     #       <=== Dummy instruction, just to test riscv32-as
        auipc   x1,%hi(0x00010004)                      #       <=== Dummy instruction, just to test riscv32-as
        addi    x1,x1,%lo(0x00010004)           #       <=== Dummy instruction, just to test riscv32-as

        lw              x15,MON_OUT_ADDR_OFFSET(x1)
        lw              x8,BASE_ADDR_OFFSET(x1)

wfi_endless_loop:
        j               wfi_endless_loop





.org    0x00010000


#isr_data:
.word   MON_OUT_ADDR

isr_data:
.word   MON_BASE_ADDR
.section.text
.globl_启动
_开始:
.eq MON_OUT_ADDR,0x00000000#待定
.eq MON_BASE_ADDR,0x12345678#待定
.eq MON\u OUT\u ADDR\u偏移量,0x0
.equ基本地址偏移量,0x4
#.org 0x0#待定。
周一isr:

j isr_data#我怀疑立即字段为0的原因是因为您正在查看一个尚未链接的对象文件

如果使用显示重新定位信息的
-r
在可执行文件上运行
readelf
,您应该会看到如下内容:

Relocation section '.rela.text' at offset 0x1018c contains 11 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000004  00000917 R_RISCV_PCREL_HI2 00010004   isr_data + 0
00000008  00000b18 R_RISCV_PCREL_LO1 00000004   .L0  + 0
0000000c  00000a17 R_RISCV_PCREL_HI2 00000030   wfi_endless_loop + 0
00000010  00000c18 R_RISCV_PCREL_LO1 0000000c   .L0  + 0
00000014  0000091a R_RISCV_HI20      00010004   isr_data + 0
00000014  00000033 R_RISCV_RELAX                0
00000018  00000917 R_RISCV_PCREL_HI2 00010004   isr_data + 0
0000001c  0000091b R_RISCV_LO12_I    00010004   isr_data + 0
0000001c  00000033 R_RISCV_RELAX                0
00000000  00000911 R_RISCV_JAL       00010004   isr_data + 0
00000030  00000a11 R_RISCV_JAL       00000030   wfi_endless_loop + 0
这是链接器将用于将指令中的值替换为正确值并使程序可执行的信息。因此,直接数始终为0的原因是,它们还没有得到最终值


您可以通过运行
riscv ld yourobject.o-o yourexecutable

使对象文件可执行。您可以在
.o
上使用
objdump-dr
转储符号重定位,并查看将在linking.AFAIR上填写的符号名称(以及相对于文件开头的地址),MIPSR6也会发生同样的情况,尽管PC相对目标位于同一文件的同一部分IOW中,尽管装配时已知距离。我不知道原因,但一切最终都在链接时解决。谢谢你的回答。我不打算使用链接器,也不打算使用对象文件——只需组装、生成列表、用Perl脚本解析它,并将“readmemh”文件生成到Verilog数组中。似乎我必须使Perl脚本更智能,以处理这种特殊情况,除非有一些汇编程序开关可以使它在生成列表之前“意识到”PC的相对地址。
Relocation section '.rela.text' at offset 0x1018c contains 11 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000004  00000917 R_RISCV_PCREL_HI2 00010004   isr_data + 0
00000008  00000b18 R_RISCV_PCREL_LO1 00000004   .L0  + 0
0000000c  00000a17 R_RISCV_PCREL_HI2 00000030   wfi_endless_loop + 0
00000010  00000c18 R_RISCV_PCREL_LO1 0000000c   .L0  + 0
00000014  0000091a R_RISCV_HI20      00010004   isr_data + 0
00000014  00000033 R_RISCV_RELAX                0
00000018  00000917 R_RISCV_PCREL_HI2 00010004   isr_data + 0
0000001c  0000091b R_RISCV_LO12_I    00010004   isr_data + 0
0000001c  00000033 R_RISCV_RELAX                0
00000000  00000911 R_RISCV_JAL       00010004   isr_data + 0
00000030  00000a11 R_RISCV_JAL       00000030   wfi_endless_loop + 0