当前位置: 首页 > 知识库问答 >
问题:

长多字节NOP:通常理解的宏或其他符号

糜运良
2023-03-14

x86(和x86_64)处理器不仅有单字节NOP指令,还有各种类型的多字节NOP指令,这不是什么大秘密。

这些是我设法找到的:

AMD推荐,参考。AMD系列15h处理器的AMD软件优化指南,文档#47414,第5.8节“带有操作大小覆盖和多字节NOP的代码填充”,第94页)

90                              NOP1_OVERRIDE_NOP
6690                            NOP2_OVERRIDE_NOP
0f1f00                          NOP3_OVERRIDE_NOP
0f1f4000                        NOP4_OVERRIDE_NOP
0f1f440000                      NOP5_OVERRIDE_NOP
660f1f440000                    NOP6_OVERRIDE_NOP
0f1f8000000000                  NOP7_OVERRIDE_NOP
0f1f840000000000                NOP8_OVERRIDE_NOP
660f1f840000000000              NOP9_OVERRIDE_NOP
66660f1f840000000000            NOP10_OVERRIDE_NOP
6666660f1f840000000000          NOP11_OVERRIDE_NOP

英特尔推荐,参考英特尔 64 和 IA-32 架构软件开发人员手册第 2B 卷:指令集参考,N-Z,“NOP”部分

90                              NOP
6690                            66 NOP
0f1f00                          NOP DWORD ptr [EAX]
0f1f4000                        NOP DWORD ptr [EAX + 00H]
0f1f440000                      NOP DWORD ptr [EAX + EAX*1 + 00H]
660f1f440000                    66 NOP DWORD ptr [EAX + EAX*1 + 00H]
0f1f8000000000                  NOP DWORD ptr [EAX + 00000000H]
0f1f840000000000                NOP DWORD ptr [EAX + EAX*1 + 00000000H]
660f1f840000000000              66 NOP DWORD ptr [EAX + EAX*1 + 00000000H]

GNU汇编器(在binutils/gas中)包括以下模式:

F32(到奔腾的较旧英特尔兼容CPU):

90                              nop
6690                            xchg %ax,%ax
8d7600                          leal 0(%esi),%esi
8d742600                        leal 0(%esi,1),%esi
908d742600                      nop; leal 0(%esi,1),%esi
8db600000000                    leal 0L(%esi),%esi
8db42600000000                  leal 0L(%esi,1),%esi
908db42600000000                nop; leal 0L(%esi,1),%esi
89f68dbc2700000000              movl %esi,%esi; leal 0L(%edi,1),%edi
8d76008dbc2700000000            leal 0(%esi),%esi; leal 0L(%edi,1),%edi
8d7426008dbc2700000000          leal 0(%esi,1),%esi; leal 0L(%edi,1),%edi
8db6000000008dbf00000000        leal 0L(%esi),%esi; leal 0L(%edi),%edi
8db6000000008dbc2700000000      leal 0L(%esi),%esi; leal 0L(%edi,1),%edi
8db426000000008dbc2700000000    leal 0L(%esi,1),%esi; leal 0L(%edi,1),%edi

alt(适用于现代CPU,与英特尔相同

0f1f00                          nopl (%[re]ax)
0f1f4000                        nopl 0(%[re]ax)
0f1f440000                      nopl 0(%[re]ax,%[re]ax,1)
660f1f440000                    nopw 0(%[re]ax,%[re]ax,1)
0f1f8000000000                  nopl 0L(%[re]ax)
0f1f840000000000                nopl 0L(%[re]ax,%[re]ax,1)
660f1f840000000000              nopw 0L(%[re]ax,%[re]ax,1)
662e0f1f840000000000            nopw %cs:0L(%[re]ax,%[re]ax,1)

alt_short(适用于现代AMD系列CPU):

0f1f440000660f1f440000          nopl 0(%[re]ax,%[re]ax,1); nopw 0(%[re]ax,%[re]ax,1)
660f1f440000660f1f440000        nopw 0(%[re]ax,%[re]ax,1); nopw 0(%[re]ax,%[re]ax,1)
660f1f4400000f1f8000000000      nopw 0(%[re]ax,%[re]ax,1); nopl 0L(%[re]ax)
0f1f80000000000f1f8000000000    nopl 0L(%[re]ax); nopl 0L(%[re]ax)
0f1f80000000000f1f840000000000  nopl 0L(%[re]ax); nopl 0L(%[re]ax,%[re]ax,1)

alt_long(用于现代英特尔系列CPU):

66662e0f1f840000000000          data16; nopw %cs:0L(%[re]ax,%[re]ax,1)
6666662e0f1f840000000000        data16; data16; nopw %cs:0L(%[re]ax,%[re]ax,1)
666666662e0f1f840000000000      data16; data16; data16; nopw %cs:0L(%[re]ax,%[re]ax,1)
66666666662e0f1f840000000000    data16; data16; data16; data16; nopw %cs:0L(%[re]ax,%[re]ax,1)
6666666666662e0f1f840000000000  data16; data16; data16; data16; data16; nopw %cs:0L(%[re]ax,%[re]ax,1)

我的问题如下:所有这些字节序列是否有任何广泛/通用的命名,例如宏、伪助记符或类似的东西?到目前为止,我只发现:

  • AMD建议将它们命名为<code>NOPx_OVERRIDE_NOP(<code>x=字节长度)
  • gas理解nopw(作为2字节nop)和nopl(作为4字节nop)

现代反汇编者倾向于如何输出这些值?

相关但不重复的问题:NOPL在x86系统中做什么?

共有1个答案

严信瑞
2023-03-14

binutils中最近的GAS有一个. nops N伪指令,它扩展到目标请求的字节数:

    < li > <代码>。nops 大小 [, 控制 ]
 类似资料:
  • 问题内容: 我正在尝试用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一只狗和一只山羊”。 但是,它不会产生“我有一只狗,一只山羊和一只猫”,而是会产生“我有一只猫,一只猫和一只猫”。在JavaScript中是否可以同时用多个其他字符串替换多个字符串,以便产生正确的结果? 问题答案: 具体解决方案 您可以使用一个函数替换每个函数。 概括它 如果您要动态维护正则表达式并仅将将来的交换添加

  • 我正在尝试用多个其他单词替换字符串中的多个单词。绳子是“我有一只猫,一只狗,和一只山羊。” 然而,这并不产生“我有一只狗,一只山羊,一只猫”,而是产生“我有一只猫,一只猫,一只猫”。是否可以在JavaScript中同时用多个其他字符串替换多个字符串,从而产生正确的结果?

  • 编写宏需要格外小心。函数被隔离在它自己的词法世界中,但是宏就另当别论了,因为它要被展开成进调用方的代码,所以除非仔细编写,否则它将会给用户带来意料之外的不便。第 9 章详细说明了变量捕捉,它是这些不速之客中最常见的一个。本章将讨论在编写宏时需要避免的另外四个问题。 10.1 求值的次数 [示例代码 10.1] 控制参数求值 正确的版本: (defmacro for ((var start stop

  • 其他的细节 java8 bulid: Web3j提供对所有响应类型的安全访问。可选的或null响应java 8都支持。 异步请求包在一个java 8的CompletableFutures。Web3j提供了围绕所有异步请求的打包工具,以确保在执行期间可以捕获任何异常,而不只是丢弃。由于在完全检查中会有很多缺少支持的异常情况,这些异常通常被确定为未检测到的异常,导致检测过程出现问题。有关详细信息,请参

  • 问题内容: 我想使用Swift 创建一个 n个 空格的字符串,但不使用循环或像这样手动: 问题答案: 已经拥有一个初始化程序,就像(和其他采用该协议的集合)一样: 因此,您可以致电: 请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此,如果需要,您可以重复整个序列: 编辑: 更改为Swift 3语法,并删除了对Swift 1类型歧义问题的讨论。如果您需要使用旧版本,请查看编辑历史记录。

  • 如何获取< code>NSString的字节长度?如果< code>myString包含“hallo”,< code>myString.length将返回5,但实际取了多少字节呢?