gpt4 book ai didi

assembly - 为什么 x86 nopl 指令需要一个操作数?

转载 作者:行者123 更新时间:2023-12-02 03:37:41 37 4
gpt4 key购买 nike

为什么nopl x86 中的指令需要操作数吗? nops 不就是什么都不做吗?

nopl   0x0(%rax)

最佳答案

许多处理器的二进制指令集有多种表示功能相同指令的方式。例如,原始 ARM 指令集包括用 b << n 形式的任何值加载 R0 的指令。哪里b是 0 到 255 之间的值,并且 n是从 0 到 24 的偶数。如果想要将值 256 加载到 R0,则可以加载将其加载为 1<<8 的指令。 ,或者可以使用 4<<6 的指令, 16<<4 ,或64<<2 。加载这些不同值的指令都具有不同的二进制编码,即使所有四个指令都具有相同的效果。

一些编译器的汇编器不遗余力地提供方法来请求一段代码应该使用哪些看似相同的指令。虽然这通常并不重要,但有时可能需要避免在一段代码中使用某些字节值,或者有时对一段代码中的某些字节进行修改可能会产生特定的效果。例如,上述ARM指令中的8位用于指定b的值。 。如果代码要覆盖b上述指令之一的值为 12 的一部分,加载到 R0 中的值将取决于使用了原始四个指令中的哪一个;它可能是 0x0C00、0x0300、0x00C0 或 0x0030。

尽管 8x86 的汇编器通常无法显式区分所有可能的指令编码,但在某些情况下,能够指定指令中应包含哪些字节值可能会有所帮助。例如,处理异常的一种方法是在异常发生时进行例行检查,检查返回地址处的指令是否是某种特定形式的 NOP,如果是,则将其操作数解释为数据结构的地址保存与异常相关的信息。在实践中,大多数支持异常的 8x86 语言使用其他方法来处理异常,但是上述方法会减慢正常函数返回的速度(获取和执行长 NOP 所需的时间),但能够相对有效地处理异常退出(大多数语言使用较慢的方法来处理中断,以避免在无异常情况下执行 NOP 的成本,但其他语言可以选择以不同的方式做事)。

关于assembly - 为什么 x86 nopl 指令需要一个操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17030771/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com