【发布时间】:2021-11-16 13:10:03
【问题描述】:
在 RISC-V 中故意引发非法指令的最简单、最易读和最直接的方法是什么?
我知道根据规范,任何“全零”指令(因此 32/16 位只有零)都是“定义的非法指令”(第 12.5 节,用户规范)。但我不知道是否存在一个 asm 简写(至少我找不到),然后我可以在 C 代码的内联 asm 中使用它。
肯定有一种便携且可靠的方式总是会导致非法指令异常吗?我个人发现写入只读寄存器或类似的黑客非常令人反感,因为它们不是很明确。但也许这就是它的完成方式?
提前谢谢你
【问题讨论】:
-
任何与 GNU C / GAS 兼容的 inline-asm 语法都允许您使用
.word 0为 RISC-V 目标发出四个字节的零。它可能还有一个助记符,IDK。 -
reviews.llvm.org/D54316 c.unimp
-
@peterCordes 你是对的!我可以简单地把“asm volatile(".word 0");"进入C代码。永远不会想到编译器/汇编器会吃掉它!谢谢
-
@dratenik 谢谢,这正是我想要的!!简单明了:asm volatile ("unimp");。它只是再次归零,但更具可读性。
-
汇编器只是将字节汇编到输出中(在当前部分)。 GNU C 内联 asm 的工作原理是将此文本打印到编译器的 asm 输出中,最终将馈送到汇编器。 (并且 clang 的工作原理就像发生了这种情况一样,至少对于具有纯粹局部影响的事物或
.pushsection/.popsection将一些数据放在某个地方。)这就是它起作用的原因。但是,是的,有一个unimp助记符很好,这总是比手动编码好,尤其是当您可能编译为 16 位压缩指令时。
标签: assembly inline-assembly riscv illegal-instruction