NOP空指令介绍 您所在的位置:网站首页 nope中文什么意思 NOP空指令介绍

NOP空指令介绍

2023-06-09 02:43| 来源: 网络整理| 查看: 265

这个指令在汇编中的作用是空指令,意味着什么都不做的意思,一般用来控制CPU的时间周期,达到时钟延时的效果

首先说一下什么是CPU时钟:

CPU时钟:处理器芯片是在特定的时钟频率下进行工作的。处理器的速度用时钟频率衡量。

其次衡量的单位以赫兹为单位:

首先你要明白什么是频率,频率的单位Hz(赫兹)。1Hz就是每秒完成一个周期,10Hz是每秒完成10个周期。不过,Hz这个单位太小了,通常以KHz、MHz或GHz来表示信号频率。 1GHz=1000MHz 1MHz=1000KHz 1KHz=1000Hz 1GHz=1000MHz 1MHz=1000KHz 1KHz=1000Hz 如果你的CPU上的单位为1GHz的话意味着你的CPU每秒能完成1000MHZ个周期!

每个周期都会通过数据总线以及外部总线去取数据和处理数据!

有的时候我们想要让CPU等待一会处理我们的指令,那么在此期间需要让CPU在执行我们程序代码段时什么都不做,也就是给定一个空指令,NOP,并且该指令是会自动对齐CPU内存寻址!

注意程序是不能主动获取CPU控制权的,是由操作系统分配的,所以当操作系统将CPU的控制权分配给你一段时间,这段时间里你什么都不想做的情况下就可以使用该语句,当时间过了之后CPU控制权收回时,操作系统会把程序的代码执行状况保存到PCB进程控制块里,以便下次执行!

关于内存对齐详解:详解C语言内存对齐

一个周期只能用于一次CPU寻址或处理,在汇编标准里一个NOP是会和CPU架构对齐的,达到内存对齐

而一个时钟周期只能完成一次寻址或处理指令,所以NOP也就占用一个时钟周期!也就是1us

1us=0.000001s

下面是不同的CPU架构所占用不同的字节:

CPU架构

助忆码

字长

操作码

备注

Intelx86系列CPU

NOP

1; i686中为1-9

0x90; 0x0f 0x1f [2]

x86 CPU上的NOP指令实质上是XCHG EAX, EAX(操作码同为0x90)--无任何作用的指令。

Intel 8051 /MCS-51系列

NOP

1

0x00

MIPS

NOP

4

0x00000000

MOS科技 65xx

NOP

1

0xea

65C02处理器发布时,之前多数的无效指令都被定义成了具有不同字长和需时的NOP指令。

PowerPC

NOP

4

0x60000000 (ori r0,r0,0的扩展操作码)

此外其实在C/C++编译器里;即意味着NOP空指令什么都不做,但也被编译器用来作为分割符!

当我们在一些带有作用域"{}"的语句里使用";"时,编译器会把";"视为NOP指令什么都不做,同时也作为这段语句的结束,也就是这个语句块什么都不做,那么编译器就不会去编译这段代码,但是不会添加NOP指令,来占用CPU时钟周期!因为这样做会降低CPU运行效率!

列如:

while语句是带有作用域的语句,如果你在while后面加上;编译器则视为该语句只循环,但循环体里什么都不做

while(true);

其效果与:

while(true){ }

是一样的,但是编译速度要快于while(true){},因为编译器还要检查作用域里是否有语句,在做相应的编译!

大多数情况下该语句都用于破解它人程序:

列如如下判断:

if(0 == i){ printf("i==0"); }

只有在i=0的前提下才会执行printf("i==0");这条语句,但是我们可以使用一些反编译工具将if判断语句填充为nop指令,让其什么都不做,然后无条件的执行printf("i==0")这条语句,也就是if语句被nop填充之后,if语句就失效了,无效了,那么if语句作用域下的语句会被无条件执行!

一般用于破解它人要求验证的程序,同时我们无需考虑内存对齐CPU寻址的问题,因为使用NOP指令的字节占用是与CPU对应的!这个在填充时取决于你反编译程序所使用的是哪个架构的指令集!

因为上面也说了,在不同的架构上NOP指令长度不同,所以占用字节也不一样!

置于CPU是怎样知道这段指令是NOP指令呢?

CPU处理指令的过程:

计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码(通过译码器),分析其指令性质。如指令要求操作数,则寻找操作数地址。 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码(通过译码器),分析其指令性质。如指令要求操作数,则寻找操作数地址。 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

译码器:是将取得的二进制指令,通过CPU架构里提供的指令集库分析指令要做什么,比如MOV AX,0E0H,其机器码为“01101011”,意思为将EOH值送入AX寄存器,那么译码器会翻译成对应的电平脉冲信号,让CPU去处理!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有