day6 跳转与存储器访问指令

目录

1.2 跳转指令

     ARM指令的条件执行

         比较指令

 1.3 Load/Srore指令:访问(读写)内存

        @ 写内存

        @ 读内存

        @ 读/写指定的数据类型

 寻址方式     

寻址方式就是CPU寻找一个操作数的方式

        @ 基址加变址寻址的索引方式


1.2 跳转指令

实现程序的跳转,本质就是修改了PC寄存器

      方式一:直接修改PC寄存器的值(不建议使用,需要自己计算目标指令的绝对地址)

 MAIN:

         MOV R1, #1

         MOV R2, #2

         MOV R3, #3

         MOV PC, #0x18

         MOV R4, #4

         MOV R5, #5    

 FUNC:

        MOV R6, #6

        MOV R7, #7

        @MOV R8, #8

    

        方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址

 MAIN:

         MOV R1, #1

         MOV R2, #2

         MOV R3, #3

         B   FUNC

         MOV R4, #4

         MOV R5, #5    

 FUNC:

         MOV R6, #6

         MOV R7, #7

         MOV R8, #8

        

方式三:带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器

 MAIN:

         MOV R1, #1

         MOV R2, #2

         MOV R3, #3

         BL  FUNC

         MOV R4, #4

         MOV R5, #5    

 FUNC:

         MOV R6, #6

         MOV R7, #7

         MOV R8, #8

         MOV PC, LR

         @ 程序返回

        

     ARM指令的条件执行

         比较指令

      CMP指令的本质就是一条减法指令(SUBS),只是没有将运算结果存入目标寄存器

        @ MOV R1, #1

        @ MOV R2, #2

        @ CMP R1, R2

        @ BEQ FUNC    

        @ 执行逻辑:if(EQ){B FUNC}    本质:if(Z==1){B FUNC}

        @ BNE FUNC    

        @ 执行逻辑:if(NQ){B FUNC}    本质:if(Z==0){B FUNC}

        @ MOV R3, #3

        @ MOV R4, #4

        @ MOV R5, #5

@ FUNC:

        @ MOV R6, #6

        @ MOV R7, #7

        @ ARM指令集中大多数指令都可以带条件码后缀

        @ MOV R1, #1

        @ MOV R2, #2

        @ CMP R1, R2

        @ MOVGT R3, #3

        

        @ 练习:用汇编语言实现以下逻辑

            @ int R1 = 9;

            @ int R2 = 15;

        @ START:

            @ if(R1 == R2)

            @ {

            @     STOP();

            @ }

            @ else if(R1 > R2)

            @ {            

            @     R1 = R1 - R2;

            @     goto START;

            @ }

            @ else

            @ {

            @     R2 = R2 - R1;

            @    goto START;

            @ }

        

        @ 练习答案

        @ MOV R1, #9

        @ MOV R2, #15

@ START:

        @ CMP R1,R2

        @ BEQ STOP

        @ SUBGT R1, R1, R2

        @ SUBLT R2, R2, R1

        @ B START

@ STOP:                

        @ B STOP

        

                

 1.3 Load/Srore指令:访问(读写)内存

    

        @ 写内存

        @ MOV R1, #0xFF000000

        @ MOV R2, #0x40000000

        @ STR R1, [R2] 

        @ 将R1寄存器中的数据写入到R2指向的内存空间

        

        @ 读内存

        @ LDR R3, [R2]

        @ 将R2指向的内存空间中的数据读取到R3寄存器

        

        @ 读/写指定的数据类型

        @ MOV R1, #0xFFFFFFFF

        @ MOV R2, #0x40000000

        

        @ STRB R1, [R2]

        @ 将R1寄存器中的数据的Bit[7:0]写入到R2指向的内存空间

        

        @ STRH R1, [R2]     

        @ 将R1寄存器中的数据的Bit[15:0]写入到R2指向的内存空间

        

        @ STR  R1, [R2]     

        @ 将R1寄存器中的数据的Bit[31:0]写入到R2指向的内存空间

        

        @ LDR指令同样支持以上后缀

        

        

 寻址方式     

寻址方式就是CPU寻找一个操作数的方式

        

        @ 立即寻址

        @ MOV R1, #1

        @ ADD R1, R2, #1

        

        @ 寄存器寻址

        @ ADD R1, R2, R3

        

        @ 寄存器移位寻址

        @ MOV R1, R2, LSL #1

        

        @ 寄存器间接寻址

        @ STR R1, [R2] 

        

        @ ...

        

        @ 基址加变址寻址的索引方式

        

        @ 前索引

        @ MOV R1, #0xFFFFFFFF

        @ MOV R2, #0x40000000

        @ STR R1, [R2,#8]

        @ 将R1寄存器中的数据写入到R2+8指向的内存空间

        

        @ 后索引

        @ MOV R1, #0xFFFFFFFF

        @ MOV R2, #0x40000000

        @ STR R1, [R2],#8

        @ 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8

        

        @ 自动索引

        @ MOV R1, #0xFFFFFFFF

        @ MOV R2, #0x40000000

        @ STR R1, [R2,#8]!

        @ 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8

        

        @ 以上寻址方式和索引方式同样适用于LDR

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