【问题标题】:Raise an Illegal Instruction in RISC-V on Purpose故意在 RISC-V 中提出非法指令
【发布时间】: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。
  • @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


【解决方案1】:

它的助记符是unimp。它是documented in the RISC-V asm manual,所以它应该是可移植的。

【讨论】:

猜你喜欢
  • 2018-11-22
  • 2023-03-22
  • 1970-01-01
  • 2014-12-10
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多