DSP

NOP空指令介绍

2019-07-13 19:15发布

这个指令在汇编中的作用是空指令,意味着什么都不做的意思,一般用来控制CPU的时间周期,达到时钟延时的效果首先说一下什么是CPU时钟:CPU时钟:处理器芯片是在特定的时钟频率下进行工作的。处理器的速度用时钟频率衡量。其次衡量的单位以赫兹为单位:首先你要明白什么是频率,频率的单位Hz(赫兹)。1Hz就是每秒完成一个周期,10Hz是每秒完成10个周期。不过,Hz这个单位太小了,通常以KHz、MHz或GHz来表示信号频率。

1GHz=1000MHz 1MHz=1000KHz 1KHz=1000Hz如果你的CPU上的单位为1GHz的话意味着你的CPU每秒能完成1000个周期!每个周期都会通过数据总线以及外部总线去取数据和处理数据!有的时候我们想要让CPU等待一会处理我们的指令,那么在此期间需要让CPU在执行我们程序代码段时什么都不做,也就是给定一个空指令,NOP,并且该指令是会自动对齐CPU内存寻址!注意程序是不能主动获取CPU控制权的,是由操作系统分配的,所以当操作系统将CPU的控制权分配给你一段时间,这段时间里你什么都不想做的情况下就可以使用该语句,当时间过了之后CPU控制权收回时,操作系统会把程序的代码执行状况保存到PCB进程控制块里,以便下次执行!关于内存对齐详解:详解C语言内存对齐一个周期只能用于一次CPU寻址或处理,在汇编标准里一个NOP是会和CPU架构对齐的,达到内存对齐而一个时钟周期只能完成一次寻址或处理指令,所以NOP也就占用一个时钟周期!也就是1us1us=0.0001s下面是不同的CPU架构所占用不同的字节:CPU架构助忆码字长操作码备注Intelx86系列CPUNOP1; i686中为1-90x90; 0x0f 0x1f [2]x86 CPU上的NOP指令实质上是XCHG EAX, EAX(操作码同为0x90)--无任何作用的指令。Intel 8051 /MCS-51系列NOP10x00 MIPSNOP40x00000000 MOS科技 65xxNOP10xea65C02处理器发布时,之前多数的无效指令都被定义成了具有不同字长和需时的NOP指令。PowerPCNOP40x60000000 (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中的值从程序存储器读出现行指令,送到指令寄存器。

分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码(通过译码器),分析其指令性质。如指令要求操作数,则寻找操作数地址。
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。 译码器:是将取得的二进制指令,通过CPU架构里提供的指令集库分析指令要做什么,比如MOV AX,0E0H,其机器码为“01101011”,意思为将EOH值送入AX寄存器,那么译码器会翻译成对应的电平脉冲信号,让CPU去处理!