day6 数据处理指令

@ 1.指令:能够编译生成一条32位的机器码,且能被CPU识别和执行

    @ 1.1 数据处理指令:数学运算、逻辑运算

    

        @ 数据搬移指令

        

        @ MOV R1, #1

        @ R1 = 1

        @ MOV R2, R1

        @ R2 = R1

        

        @ MVN R0, #0xFF 

        @ R0 = ~0xFF

        

        @ 立即数

        @ 立即数的本质就是包含在指令当中的数,属于指令的一部分

        @ 立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快

        @ 立即数的缺点:不能是任意的32位的数字,有局限性

        @ MOV R0, #0x12345678

        @ MOV R0, #0x12

        

        @ 编译器替换

        @ MOV R0, #0xFFFFFFFF

        

        @ 数据运算指令基本格式

        @    《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》

        @        操作码            指示执行哪种运算

        @        目标寄存器:    存储运算结果

        @        第一操作寄存器:第一个参与运算的数据(只能是寄存器)

        @        第二操作数:    第二个参与运算的数据(可以是寄存器或立即数)

        

        @ 加法指令

        @ MOV R2, #5

        @ MOV R3, #3

        @ ADD R1, R2, R3

        @ R1 = R2 + R3

        @ ADD R1, R2, #5

        @ R1 = R2 + 5

        

        @ 减法指令

        @ SUB R1, R2, R3

        @ R1 = R2 - R3

        @ SUB R1, R2, #3

        @ R1 = R2 - 3

        

        @ 逆向减法指令

        @ RSB R1, R2, #3

        @ R1 = 3 - R2

        

        @ 乘法指令

        @ MUL R1, R2, R3

        @ R1 = R2 * R3

        @ 乘法指令只能是两个寄存器相乘

        

        @ 按位与指令

        @ AND R1, R2, R3

        @ R1 = R2 & R3

        

        @ 按位或指令

        @ ORR R1, R2, R3

        @ R1 = R2 | R3

        

        @ 按位异或指令

        @ EOR R1, R2, R3

        @ R1 = R2 ^ R3

        

        @ 左移指令

        @ LSL R1, R2, R3

        @ R1 = (R2 << R3)

        

        @ 右移指令

        @ LSR R1, R2, R3

        @ R1 = (R2 >> R3)

        

        @ 位清零指令

        @ MOV R2, #0xFF

        @ BIC R1, R2, #0x0F

        @ 第二操作数中的哪一位为1,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器

        

        @ 格式扩展

        @ MOV R2, #3

        @ MOV R1, R2, LSL #1

        @ R1 = (R2 << 1)

        

        @ 数据运算指令对条件位(N、Z、C、V)的影响

        @ 默认情况下数据运算不会对条件位产生影响,在指令后加后缀”S“才可以影响

        

        @ 带进位的加法指令

        @ 两个64位的数据做加法运算

        @ 第一个数的低32位放在R1

        @ 第一个数的高32位放在R2

        @ 第二个数的低32位放在R3

        @ 第二个数的高32位放在R4

        @ 运算结果的低32位放在R5

        @ 运算结果的高32位放在R6

        

        @ 第一个数

        @ 0x00000001 FFFFFFFF

        @ 第二个数

        @ 0x00000002 00000005

        

        @ MOV R1, #0xFFFFFFFF

        @ MOV R2, #0x00000001

        @ MOV R3, #0x00000005

        @ MOV R4, #0x00000002

        @ ADDS R5, R1, R3

        @ ADC  R6, R2, R4

        @ 本质:R6 = R2 + R4 + 'C'

        

        @ 带借位的减法指令

        

        @ 第一个数

        @ 0x00000002 00000001

        @ 第二个数

        @ 0x00000001 00000005

        

        @ MOV R1, #0x00000001

        @ MOV R2, #0x00000002

        @ MOV R3, #0x00000005

        @ MOV R4, #0x00000001

        @ SUBS R5, R1, R3

        @ SBC  R6, R2, R4

        @ 本质:R6 = R2 - R4 - '!C'

你可能感兴趣的:(我的小白学习笔记,LV.12,ARM体系结构与接口技术,arm,驱动开发,arm开发,c语言,linux)