汇编指令小结

CSDN仅用于增加百度收录权重,排版未优化,评论不回复。请访问:www.hceng.cn 查看、评论
本博文对应地址: https://hceng.cn/2017/03/10/汇编指令小结/#more

本文主要是记录一些遇到的ARM汇编知识。

汇编代码以韦东山老师的 第7章nand flash实验配套代码13th_link_4096 中的start.S为例:
{% codeblock lang:asm [start.S]%}
.globl _start
_start:

/* 硬件相关的设置 : 把外设的基地址告诉CPU*/
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)

/* 关看门狗 /
/
往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]

/* 重定位 /
adr r0, _start /
_start当前指令地址 /
ldr r1, =_start /
_start的编译地址 */
ldr r2, =bss_start
cmp r0, r1
beq clean_bss
copy_loop:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1, r2
bne copy_loop

/* 清BSS段 */
clean_bss:
ldr r0, =bss_start
ldr r1, =bss_end
mov r2, #0
clean_loop:
str r2, [r0], #4
cmp r0, r1
bne clean_loop

/* 设置栈 */
ldr sp, =8*1024
ldr pc, =main /* 重定位完后, 使用位置相关的指令跳转 */
bl main

halt:
b halt
{% endcodeblock %}


第六行:
{% codeblock lang:asm %}
ldr r0, =0x70000000
{% endcodeblock %}

  • 格式:ldr 目的寄存器 <存储器地址>
  • 作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。

第七行:
{% codeblock lang:asm %}
orr r0, r0, #0x13
{% endcodeblock %}

  • 格式:orr 目的寄存器, 操作数 1, 操作数 2
  • 作用:常用于设置操作数1 的某些位,在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器、被移位的寄存器或一个立即数。

第八行:
{% codeblock lang:asm %}
mcr p15,0,r0,c15,c2,4
{% endcodeblock %}

  • 格式:mcr 协处理器编码, 协处理器操作码1, 源寄存器, 目的寄存器1, 目的寄存器2, 协处理器操作码2
  • 作用:将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1协处理器操作码2 为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1目的寄存器2均为协处理器的寄存器。

第十四行:
{% codeblock lang:asm %}
str r1, [r0]
{% endcodeblock %}

  • 格式:str 源寄存器 <存储器地址>
  • 作用:用于从源寄存器中将一个32位的字数据传送到存储器中。在ARM架构下, 数据从内存到CPU之间的移动只能通过ldr/str指令来完成。而mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位。

第十七行:
{% codeblock lang:asm %}
adr r0, _start
{% endcodeblock %}

  • 格式:adr 目的寄存器 程序相对的表达式
  • 作用:可将一个立即值与pc值相加,并将结果写入目标寄存器。adr可生成与位置无关的代码,因为地址相对于程序或寄存器。详见ARM指令adr

第二十行:
{% codeblock lang:asm %}
cmp r0, r1
{% endcodeblock %}

  • 格式:cmp 操作数1, 操作数2
  • 作用:用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT 后缀的指令将可以执行。

CPSR注:

  • Z标志:是否为0;如比较指令产生相等的结果、计算结果为0;
  • N标志:是否为负;如果指令的结果被认为是有符号数,而它的第31位为1,那就会被设置为1;
  • C标志:是否有产生进位/借位,以及进行移位操作时作移出位使用;
  • V标志:有符号数进行运算,结果是否有溢出。

第二十一行:
{% codeblock lang:asm %}
beq clean_bss
{% endcodeblock %}

  • 格式:beq 标签
  • 作用:数据跳转指令,标志寄存器中Z标志位等于零时, 跳转到beq后标签处。

第二十六行:
{% codeblock lang:asm %}
bne copy_loop
{% endcodeblock %}

  • 格式:bne 标签
  • 作用:数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到bne后标签处。

第四十一行:
{% codeblock lang:asm %}
bl main
{% endcodeblock %}

  • 格式:bl 子程序名
  • 作用:b或bl指令引起处理器转移到子程序名处开始执行。两者的不同之处在于bl指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。由于bl指令保存了下条指令的地址,因此使用指令“mov pc, lr”即可实现子程序的返回。而b指令则无法实现子程序的返回,只能实现单纯的跳转。

ARM处理器控制程序执行方式注:

  • 流水方式执行程序:PC的值是下一条指令的地址,即每执行一条指令PC都加一个字的偏移。
  • 通过跳转指令来控制程序执行:b-跳转到指定的指令处执行;bl-跳转执行,保存子程序地址并返回;bx-跳转执行并切换到Thumb状态;blx-三种方式组合。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值