ARM汇编语言编程学习笔记(2)

1. 命令(伪指令)和汇编助记符指令(Instruction)的区别

①指令可以通过软件转换成机器指令

②命令不能转换成机器指令,一般用于控制汇编器和编译器对程序代码的处理。

(1)PRESERVE8命令

指定当前文件保持堆栈八字节对齐,反正汇编程序之前都得加。

(2)THUMB命令

指定接下来的指令被解释为THUMB指令。

(3)AREA命令

用于标记段的开始。

段是不可分的已命名独立的代码或数据块,由链接器处理。对于一个汇编程序来说,汇编或编译的输出内容可包括:

①一个或者多个的代码段,通常为只读。

②一个或者多个的数据段,通常为读写。

AREA指令就是对段进行命名并设置其属性,然后指定输出。这个命令的格式为:

AREA sectionname {,attr} {,attr} …

//其中:

①sectionname代表该段指定的名称

②attr是一个属性,或者是多个用逗号分开的属性。比较常见的属性太多了,等碰到了再查一查。

(4)EXPORT/GLOBAL命令

该命令声明一个符号,链接器用来解析不同对象和库文件的符号引用。

(5)FUCTION/PROC命令

该命令用来表示一个函数的开始。

(6)ENTRY命令

该命令标记要执行的第一个指令。每个程序都至少得有一个ENTRY来指示代码、指令、异常处理程序的入口点。

(7)ALIGN命令

该命令使用零或者NOP指令进行填充,把当前位置对其到指定的边界。

(8)END命令

此命令指示汇编器停止处理此源文件。

2. lst文件分析

编译器给出的列表文件.lst文件包括了编译过程中的各种信息。

它由页面头部、汇编语言列表、命令行和符号列表等构成。

(1)第一部分-汇编命令

// 可以看到,汇编命令不产生机器指令代码

(2)第二部分-向量表

①可以看到0x00000004的位置存的是处理复位向量的向量。通过该符号地址,复位事件一到来就开始执行Reset_Handler这一标号对应的复位时间服务程序中,从而执行里面的代码。

②其他的地址根据Cortex-M0的向量表,处理的是中断异常、故障等不同的数据,又因为LED这个工程不需要任何中断机制,所以直接设置0就行。

③0x40的地址开始就是外部中断所在的位置。

(3)第三部分-程序代码

 

可以看到:

①处理复位事件的程序存储地址从0x00000080开始。

②从命令ENTRY开始,机器指令地址从0x00000000开始以0x00000000、0x00000002、0x00000004开始线性递增。也就是说,每条机器指令占用两个字节,也就是2×8=16位,正好就符合THUMB是16位指令的信息。

③在指令存储地址右边是每个汇编语言助记符对应的机器指令代码。

3. map文件

在.lst文件的同一个路径下面有生成的map文件。该文件给出了程序代码在存储器中的空间分配信息。

4. hex文件

程序被下载到Cortex-M0处理器系统是程序代码以HEX文件的形式完成的过程。

4. 程序代码分析

接下来就结合软件仿真调试窗口和程序代码进行分析。

(1)从前面的lst文件分析可以知道,程序代码是从0x00000080开始的,这一点也可以从disassembly窗口里面看到。

(2)在代码逐行执行的过程中,可以在Registers窗口里看到每个寄存器的数据变化。

①在程序里,因为在硬件端已经把外设LED的地址设置为0x50000000,所以先这个地址存到寄存器R1中,然后把要写入这个地址对应存储器的数据存到R0中,最后通过STR指令完成一次数据对于响应寄存器的写入。

②在写入0x55到LED外设对应存储器后,通过BNE指令完成一次延时,延时的时间为R1每次减1,总共完成减法0x2FFFFF次。

具体的实现方法是先在一个寄存器里设置好一个数,然后通过BNE指令不断地跳转程序计数器PC到减法所在的语句,从而实现减1(同时更新APSR)。当减到0的时候,APSR里的标志位Z就变成1了,这时就完成循环,从而实现了有限次的循环操作。

③在第一次延时完成之后,通过和①一样的操作,把0xAA写到0x50000000对应存储器当中。

④再完成一次延时。

⑤最后通过无条件跳转指令B,跳转到程序代码的最开始,从而实现无限循环。

(3)在Memory窗口当中,可以看到每个地址对应存储器里面所存储的数据。

①根据向量表,0x00000000的地址是记录MSP指针地址用的。搜索存储器地址0x00000000,可以看到前4个字节和寄存器R13(SP)对上了。//而且本程序就没用过堆栈,所以SP就没动过

// 因为是小端模式,所以字节顺序反过来就是了

②根据向量表,0x00000004之后4个字节是记录复位服务程序所在存储器地址用的。搜索地址0x00000004,之后的4字节数据0x00000081就可以和程序代码所在存储器地址对上了。//因为这个工程的主程序代码就是写在复位服务程序里的

③根据向量表,0x50000000地址对应的存储器就是用来存LED外设的数据的。搜索地址0x50000000,边在仿真窗口里步进,边看值的变化情况,可以看到确实随着指令的执行而在改变。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值