NOP (code)_NOP指令作用及解析

article/2025/10/22 0:59:51

摘自:维基百科 NOP (code)

前言

  • 在计算机科学中,NOP、no-op 或 NOOP(发音为“no op”;no operation 的缩写)是一种机器语言指令及其汇编语言助记符、编程语言语句或不执行任何操作的计算机协议命令。
  •  免费的C语言和linuxPDF文档:传送门

机器语言指令

  • 一些计算机指令集包括一条指令,其明确目的是不改变任何程序员可访问的寄存器、状态标志或内存的状态。 通常需要明确定义的时钟周期数来执行。 在其他指令集中,没有明确的 NOP 指令,但汇编语言助记符 NOP 表示作为 NOP 的指令; 例如,在 SPARC 上,[sethi 0,%g0]。
  • NOP 不得访问内存,因为这可能会导致内存错误或页面错误。
  • NOP 最常用于计时目的,强制内存对齐,防止危险,占用分支延迟槽,使现有指令(例如跳转)无效,作为执行指令的目标,或作为位置 - 持有者在程序开发后期被活动指令替换(或在重组有问题或耗时时替换已删除的指令)。 在某些情况下,NOP 可能会产生轻微的副作用; 例如,在 Motorola 68000 系列处理器上,NOP 操作码会导致流水线同步

    nop指令的作用:[译者添加]

    1)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。)

    2)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!3)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复; 4)清除由上一个算术逻辑指令设置的flag位; 5)破解:)对于原程序中验证部分使用nop来填充,使验证失效; 6)有一个朋友说的比较厉害--在航天飞机控制程序中防止程序跳飞! 解释如下:在空间放射性环境下,放射性子粒很容易使内存位元改变(呵呵,有点基因突变的感觉),这样如果改变的是jump,call指令的存贮位置的话,就会导致程序跳转到一个不可以预置的位置,对于关键系统来说的确是灾难性的。所以就在被调用程序之前填充nop指令,这样即使跳转到稍前或者稍后的位置,也不会造成影响。 这让我想起《C Traps and Pitfalls》中举的那个导弹软件中的致命错误:因为导弹是以0.1s为单位进行记时的,但是由于浮点数没有办法精确的表示0.1,造成了舍尾误差,这个误差在导弹开启3天的之后逐渐的积累,结果误差了一秒。————————————————版权声明:本文为CSDN博主「prettykernel」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/erazy0/article/details/6071281

  • 从硬件设计的角度来看,总线的未映射区域通常设计为返回零; 由于 NOP 滑动行为通常是可取的,因此它倾向于使用全零操作码对其进行编码。

代码

  • 一个函数或一系列编程语言语句是一个 NOP 或 null 语句,如果它没有效果。 但在某些上下文中,某些语言的语法可能需要空语句。

在 Ada 中,null 语句用作 NOP。[6] 由于语法禁止控制语句或函数为空,因此必须使用空语句来指定不需要任何操作。 (因此,如果程序员忘记编写语句序列,程序将无法编译。)

C和衍生物
C 中最简单的 NOP 语句是 null 语句,它只是需要语句的上下文中的分号。[译者添加:空语句可能会被优化]:

;

一个空块(复合语句)也是一个 NOP,并且可能更清晰:

{}

 在某些情况下,例如函数体,必须使用块,但块可以是空的。 在 C 中,语句不能为空——简单的语句必须以 ; 结尾。 (分号)而复合语句包含在 {}(大括号)中,它本身不需要后面的分号。 因此,在语法上需要语句的上下文中,可以使用一些这样的空语句。

null 语句本身是无用的,但它可以在更广泛的上下文中使用语法,例如,在循环的上下文中:

while (getchar() != '\n') {}while (getchar() != '\n');
while (getchar() != '\n');

[请注意,最后一种形式可能会令人困惑,因此会在某些编译器或编译器选项中生成警告,因为分号通常在行尾括号后表示函数调用指令的结束]。

上面的代码继续调用函数 getchar() 直到它返回一个 \n (换行符)字符,实质上是将标准输入的当前读取位置快进到下一行的开头。

Fortran

在 Fortran 中,CONTINUE 语句用于某些上下文,例如 DO 循环中的最后一个语句,尽管它可以在任何地方使用,并且没有任何功能。 

 JavaScript
JavaScript 语言没有内置的 NOP 语句。 许多实现是可能的:

  1. 使用 ; 空语句 或 {} 空块语句与 C 和派生示例中的方式相同;
  2. 当语法不允许使用前面的方法时,使用 undefined 或 null 表达式作为完整语句(表达式语句)。

在需要功能的情况下,替代方案是:

  1. 使用 Function.prototype() 内置函数,它接受任何参数并返回 undefined;[8]
  2. 使用第三方库中可用的 NOP 函数——见下文;
  3. 定义一个自定义的 NOP 函数,如下例所示(使用 ES6 箭头函数语法):
const noop = () => {};

Python
Python 编程语言有一个 pass 语句,它在执行时没有任何效果,因此用作 NOP。 由于 Python 的缩进敏感语法,它主要用于确保正确的语法; 例如,定义类的语法需要一个带有类逻辑的缩进块,当它应该为空时必须表示为 pass。

NOP 协议命令

  • 许多计算机协议,例如 telnet,都包含一个 NOP 命令,客户端可以发出该命令来请求来自服务器的响应,而无需请求任何其他操作。 这样的命令可用于确保连接仍然有效或服务器有响应。 NOOP 命令是以下协议的一部分(这是部分列表): 

    telnet/FTP/SMTP/X11/POP3/NNTP/finger/IMAP4/BitTorrent

    请注意,与列出的其他协议不同,IMAP4 NOOP 命令具有特定用途——它允许服务器向客户端发送任何挂起的通知。

    虽然大多数 telnet 或 FTP 服务器以“OK”或“+OK”响应 NOOP 命令,但一些程序员已向客户端添加了古怪的响应。 例如,MINIX 的 ftpd 守护进程响应 NOOP 消息:

    200 NOOP to you too!

破解
在破解检查序列号、特定硬件或软件要求、硬件加密狗的存在与否等的软件时,NOP 通常会参与其中。 正在检查的预期值。 因为安全检查例程中的大多数指令都不会被使用,这些指令将被替换为 NOP,从而删除软件的安全功能,而不会改变二进制文件中所有内容的位置。
 

安全漏洞 NOP

操作码可用于形成 NOP 幻灯片,它允许代码在指令指针的确切值不确定时执行(例如,当缓冲区溢出导致堆栈上的函数返回地址被覆盖时)。

下面列出了一些 CPU 架构的 NOP 指令:

CPU architectureInstruction mnemonicBytesOpcodeNotes
Intel x86 CPU familyNOP1; 1–9 for i686 and x86-640x90[2]0x90 decodes to xchg eax, eax in all modes except long mode, where the opcode 0x90 still has no effect. The longer encodings are described in Intel's manual.
Intel 8051 / MCS-51 familyNOP10x00
ARM A32NOP40x00000000This stands for andeq r0, r0, r0. The assembly instruction nop will most likely expand to mov r0, r0 which is encoded 0xE1A00000 (little-endian architecture).[3]
ARM A32NOP40x00000000这代表andeq r0, r0, r0。 汇编指令 nop 很可能会扩展为 mov r0, r0,其编码为 0xE1A00000(小端架构)。
ARM T32 (16 bit)NOP20xb000Opcode for ADD SP, #0 - Add zero to the stack pointer (No operation). The assembly instruction nop will most likely expand to mov r8, r8 which is encoded 0x46C0.[4]
ARM T32 (32 bit)NOP40xF3AF 8000
ARM A64 (64 bit)NOP40xD503201F
AVRNOP20x0000one clock cycle

IBM System/360, 

IBM System/370,

 IBM System/390,

 z/Architecture, 

UNIVAC Series 90

NOP40x47000000 or 0x470nnnnn or 0x47n0nnnn where "n" is any 4-bit value.The NOP ("No-Op") and NOPR ("No-Op Register") are a subset of the "Branch on Condition" or "Branch on Condition Register" instructions, respectively; both versions have two options for generating a NO-OP.

In the case of both the NOP and NOPR instructions, the first 0 in the second byte is the "mask" value, the condition to test such as equal, not equal, high, low, etc. If the mask is 0, no branch occurs.

In the case of the NOPR instruction, the second value in the second byte is the register to branch on. If register 0 is chosen, no branch occurs regardless of the mask value. Thus, if either of the two values in the second byte is 0, the branch will not happen.

In the case of the NOP instruction, the second value in the second byte is the "base" register of a combined base register, displacement register and offset address. If the base register is also 0, the branch is not taken regardless of the value of the displacement register or displacement address.

NOPR20x0700 or 0x070n or 0x07n0 where "n" is any 4-bit value.
SuperHNOP20x0009
MIPSNOP40x00000000Stands for sll r0,r0,0, meaning: Logically shift register 0 zero bits to the left and store the result in register 0
MIPS-XNOP40x60000019(extended opcode for add r0,r0,r0)
MIXNOP1 word± * * * * 0The * bytes are arbitrary, and can be anything from 0 to the maximum byte (required to be in the range 63-99). MIX uses sign-magnitude representation.
MMIXSWYM40xFD******SWYM stands for "Sympathize with your machinery". The * digits can be chosen arbitrarily.
Motorola 68000 familyNOP20x4E71This synchronizes the pipeline and prevents instruction overlap.[1]
Motorola 6809NOP10x12
MOS Technology 65xx (e.g. 6502)NOP10xEANOP consumes two clock cycles. Undefined opcodes in the NMOS versions of the 65xx family were converted to be NOPs of varying instruction lengths and cycle times in the 65C02.
PowerPCNOP40x60000000(extended opcode for ori r0,r0,0)
PIC microcontrollerNOP12 bits0b000000000000MOVW 0,W
RISC-VNOP40x00000013ADDI x0, x0, 0
SPARCNOP40x01000000Stands for sethi 0, %g0 which zeroes the hardwired-to-zero %g0 register[5]
Z80NOP10x00There are some other instructions without any effect (and the same timing): LD A, ALD B, B etc.
PDP-10JFCL 0, (conventional)
JUMP, SETA, SETAI, CAI, TRN, TLN
1 word25500******* (octal)Jump never
Jump never, set nothing, skip never
PDP-11NOP16 bits000240 (octal)Clear none of the condition codes
VAXNOP10x01Delay is dependent on processor type
  •  从硬件设计的角度来看,总线的未映射区域通常设计为返回零; 由于 NOP 滑动行为通常是可取的,因此它倾向于使用全零操作码对其进行编码。

引用:


http://chatgpt.dhexx.cn/article/Dtrr8LDm.shtml

相关文章

C# NOPI导出Excel 设置计算公式,多行表头

说明 现需要导出Excel,统计每个人的工作量,计算方式为:项目分值*项目数量 效果 c#代码 //创建工作簿 MemoryStream MStream new MemoryStream();XSSFWorkbook WBook new XSSFWorkbook(); //创建sheet ISheet sheet WBook.CreateSheet(D…

vb.net读取写入EXCEl的终极方法-NOPI。

据我浅薄的知识,之前只知道两种操作excel的方法: 一。ODBC操作excel 看下图: 1.ODBC 由于初期连接不同的数据库通过各种不同的API,ODBC就是将各种不同的API封装成统一的接口。当sql语句进入接口时驱动器管理器会判断将他们送入对…

unity NOPI 创建word文档

unity NOPI 创建word文档 导入NOPI 所需要的DLL ICSharpCode.SharpZipLib.dll,NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,NPOI.OpenXmlFormats.dll 打包还需导入I18N.CJK.dll,I18N.dll,I18N.West.dll 如果导入Dll出错,设…

pnpm — Monorepo

1、安装 pnpm npm i pnpm -g 2、创建Monorepo管理文件夹,这里命名 Monorepo,并创建packages文件夹 3、创建用于定义工作空间的根目录的yaml文件: pnpm-workspace.yaml,并添加 packages:- packages/ ** 4、 pnpm init 5、pn…

NOPI用法之自定义单元格背景色(3)

NPOI针对office2003使用HSSFWorkbook,对于offce2007及以上使用XSSFWorkbook;今天我以HSSFWorkbook自定义颜色为例说明,Office2007的未研究呢 在NPOI中默认的颜色类是HSSFColor,它内置的颜色有几十种供我们选择,如果不…

c# 使用NOPI 操作Excel

最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但是有一个毛病,就是程序所在电脑安装Office,这个问题简直是致命的,因为导出服务我们要做在服务端,程序直接生成Excel,然后客户端路径去下载,…

C# NOPI 项目实战(经典)(可下载项目源码)

1 -.首先说明下项目目的: 之前我有写过一篇 "NPOI操作EXCEL" 这篇文章主要介绍了如何安装NPOI,以及NPOI具体如何c#教程使用,并且用具体实例介绍了excel导入到datagridview以及 datagridview如何导出到excel并保存。如果不清楚这块的去我公众…

NOPI将数据导出至EXCEL表格

文章目录 前言一、NPOI优势二、运行逻辑三、安装NOPI组件四、导出Excel---实现代码五、最终效果六、总结 前言 NPOI,就是POI的.NET版本。POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包…

RabbitMQ原理、集群、基本操作及常见故障处理

本次学习主要针对运维人员,和对rabbitmq不熟悉的开发人员。通过本次学习你将掌握rabbitmq 的基本原理、集群、基本运维操作、常见故障处理。 1、原理与概念 简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是…

RabbitMQ简易原理及使用

黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战_哔哩哔哩_bilibili 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件_哔哩哔哩_bilibili 安装:CentOS8安装RabbitMQ 3.8.9_wcybaonier的博客-CSDN博客 // config改为conf,rabbitmq以后缀识别&…

RabbitMQ-详细讲解原理到使用

这里写目录标题 1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比: 2.快速入门2.1.安装RabbitMQ1.单机部署1.1.下载镜像1.2.安装MQ 2.2.RabbitMQ消息模型2.3.创建一个Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结 3.Spr…

rabbitmq基本原理

AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。 AMQP当中有四个概念非常重要 1. virtual host&#xff…

RabbitMQ 内部结构原理介绍

RabbitMQ简介 RabbitMQ是一个用Erlang语言开发的、实现了AMQP协议的消息中间件。 AMQP :(Advanced Message Queue,高级消息队列协议)它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中…

Rabbitmq机制

1.发布与订阅 publish and subscribe 短信发送,消息订阅的功能一般会用到这个模式。 这个模式是通过路由器绑定消息队列来实现的,只要有队列绑定到这个路由器,就会接受改路由器的通知。 2.routing模式 路由模式 在发布订阅模式的基础增加了…

RabbitMQ 架构原理

1.RabbitMQ 架构原理 由于 RabbitMQ 实现了 AMQP 协议,所以 RabbitMQ 的工作模型也是基于 AMQP 的。理解这张图片至关重要。 1.1 Broker 中介 我们要使用 RabbitMQ 来收发消息,必须要安装一个 RabbitMQ 的服务,可以安 装在 Windows 上面也可以…

RabbitMq底层原理分析

RabbitMq消息中间件介绍&为什么要使用消息中间件&什么时候使用消息中间件 我们用java来举例子, 打个比方 我们客户端发送一个下单请求给订单系统(order)订单系统发送了 一个请求给我们的库存系统告诉他需要更改库存了, 我…

RabbitMQ集群原理介绍

文章目录 一、RabbitMQ默认集群原理1. RabbitMQ集群元数据的同步2. 为何RabbitMQ集群仅采用元数据同步的方式3. RabbitMQ集群发送/订阅消息的基本原理4. 客户端直接连接队列所在节点5. 客户端连接的是非队列数据所在节点7. 集群节点类型磁盘节点内存节点 8. 总结 二、RabbitMQ镜…

RabbitMQ的基本架构与实现原理

目录 1.RabbitMQ Exchange类型 2.RabbitMQ的数据存储 RabbitMQ整体逻辑架构 1.RabbitMQ Exchange类型 常用的交换器类型分为:Direct、Topic、 Fanout、Header 四种。 Fanout fanout类型的交换器会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中&…

Rabbit Mq 底层原理

为什么要用MQ?MQ有什么好处? 1、异步通信:通过异步通信,可以减少客户端等待时间,实现接口快速响应 2、系统解耦:对于复杂的系统,减小系统与系统之间的依赖 3、流量削峰:对于瞬时访问…

RabbitMQ工作原理以及常见面试题【2022版】

RabbitMQ工作原理图: Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似 于网络中的 namespac…