数据处理指令指的是和数学运算、逻辑运算相关的指令,比如加减乘、与或非、赋值比较等  


目录

1、MOV ——  直接搬移

(1) MOV 指令格式

(2) MOV生成指令的策略(MOV的优点)

(3) MOV 只能搬移“立即数”的原因(MOV的缺点)

2、MVN —— 先取反,后搬移

3、LDR —— 伪指令形式赋值


1、MOV ——  直接搬移

MOV类似于C语言中的直接赋值,其实就是将数据搬移到寄存器中。MOV只能搬移立即数,搬移的内容如果不是立即数,会报赋值不合法的错误。

(1) MOV 指令格式

语法:MOV  <register>, #value

使用:

MOV R0, #0        @把0搬移到r0寄存器,类似于 R0 = 0x00000000
MOV R2, R0        @把寄存器R0的值赋给R2
MOV PC, #0        @ 设置PC寄存器的值为0(PC是专用寄存器,存的是地址,必须满足4的整数倍)
                  @ 即便赋给PC的值不是4的整数倍,编译器会强制将低2位置0,使其满足4的整数倍
                  @ 比如赋值7,对应二进制111,最终会强制转成100.

注意:给寄存器赋予的值建议在 [0 , 255] 之间,也就是0x00~0xFF之间。

(2) MOV生成指令的策略(MOV的优点)

MOV生成的二进制机器码跟指令寄存器赋予的值相关。如果可以编译通过,生成的二进制机器码将包含寄存器的编号以及赋予寄存器的值。CPU在取指令的时候,指令中因为包含了数据,CPU就无需再去内存取一次数据,提升了CPU的处理效率。

o 指令

使用的汇编代码为:

  • MOV R0, #1      
  • MVN R0, #1  

o 寄存器

使用的汇编代码为:

  • MOV R0, #1      
  • MOV R9, #1  

o 搬移的值(赋予的值)

使用的汇编代码为:

  • MOV R0, #0x11      
  • MOV R0, #0x22  

(3) MOV 只能搬移“立即数”的原因(MOV的缺点)

从生成指令的策略来看,MOV生成的二进制指令主要包含三部分,分别是汇编代码、寄存器编号以及赋予寄存器的值。

赋予寄存器仅占据指令的一部分,不能是任意32位的数字,“立即数”一般是在[0, 255]这个区间里,即0x00~0xFF,搬运这个区间的数是没有问题的。超出这个区间,比如将0x1234赋值给R1寄存器,就会报如下错误。

MOV R1,#0x1234        @ 把0x1234搬移到r1寄存器

2、MVN —— 先取反,后搬移

MVN指令的作用也是搬移数据,但不是直接搬移,先将数据取反,然后再赋值给寄存器。

语法:MVN <register>, #value

使用:

MVN R0,#0xFF        @ 先将0xFF按位取反,再搬移(赋值)到R0寄存器

3、LDR —— 伪指令形式赋值

有的时候我们要把地址保存到寄存器中,但如果地址不是立即数,那就无法保存, 因此,我们可以使用 ldr 命令。ldr 命令 原本是将内存中某个地址的内容读取到寄存器,这里我们要使用的是他的伪指令形式。

ldr r0, =0x11223344     @ 相当于 r0 = 0x11223344
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐