RISC-V汇编插入自定义机器码报错,如何让编译器绕过未识别指令?
问题:RISC-V自定义Opcode汇编测试编译报错处理
我正在进行一个带有自定义Opcode的RISC-V项目,需编写类似RISC-V ISA测试的汇编测试用例。编写的测试代码如下:
RVTEST_CODE_BEGIN #------------------------------------------------------------- # Arithmetic tests #------------------------------------------------------------- li TESTNUM, 2; li x7, 0x00000002; li x1, 0x00000002; 00000000000000000000001011; bne x1, x7, fail; TEST_PASSFAIL RVTEST_CODE_END
其中00000000000000000000001011是自定义Opcode,编译时出现如下错误:
riscv32-unknown-elf-gcc -march=rv32g -mabi=ilp32 -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/home/zouzhili/riscv-tests/isa/../env/p -I/home/zouzhili/riscv-tests/isa/macros/npu -T/home/zouzhili/riscv-tests/isa/../env/p/link.ld rv32npu/vslide1down.S -o rv32npu-p-vslide1down rv32npu/vslide1down.S: Assembler messages: rv32npu/vslide1down.S:22: Error: junk at end of line, first unrecognized character is `0'
请问是否有方法让编译器绕过未识别的Opcode?
解决方法
用汇编伪指令直接嵌入机器码:
汇编器无法识别裸写的二进制数字作为指令,你需要用.word(对应32位指令)或.half(对应16位压缩指令)伪指令,把自定义Opcode的机器码转成十六进制后写入。比如你提供的二进制00000000000000000000001011转成十六进制是0x0000000B,替换原代码中的裸二进制行:.word 0x0000000B这样汇编器会直接将该十六进制值作为机器码插入到指令流中,不会尝试解析为标准指令。
注意事项:
- 如果是RV32架构的32位指令,必须填入完整的32位十六进制值,
.word会生成4字节的指令; - 如果是RV32C的16位压缩指令,改用
.half伪指令,比如.half 0x000B。
- 如果是RV32架构的32位指令,必须填入完整的32位十六进制值,
内容的提问来源于stack exchange,提问作者zhili
相关产品推荐
相关产品推荐

