汇编程序设计 - ARM汇编指令(六)

一套复杂的汇编语言设计很多内容,这里给定的内容是ARM针对GNU的编码方式进程汇编代码中一些常见的使用技巧来进行说明,将整个汇编代码框架中设计到的核心技术点进行一个梳理和总结。本人之前做过大量针对某种网络处理器的汇编代码开发,其中很多内容和ARM汇编使用格式和方法是一致的。对于不一致的地方也会做简单的说明。

1. 自定义与编译选项

1.1. 自定义

为了方便代码易读和维护,实际代码开发中对于内部的给定的寄存器我们是做对应寄存器功能划分的以方便代码编写过程中寄存器重复使用导致的代码维护问题。ARM中央控制寄存器关键功能是函数调用,寄存器划分也是按照这种格局来分配的,具体规则见ACPS章节。之前做的网络处理器,寄存器根据是否支持条件和寄存器具体使用功能模块来划分,这是两者之间的异同。当然,两者都会定义临时寄存器,方便代码的编写。对于ARM寄存器是中间的r4-r10一般作为临时寄存器使用。

1.2. 编译选项

和C原因一样,汇编也是有编译选项的,针对不同版本的芯片或者不同的功能我们可以通过编译宏来确定具体的芯片使用方式或者某个功能是否开启。

2. 宏与子程序

子程序的调用通过B语句来是完成,跳转可以是普通宏语言LABEL,也可以是某个C语言函数接口。子程序跳转指令和使用宏相比较而言宏指令效率更高,跳转指令由复杂的堆栈关系需要管理,但是大量的宏会占用指令空间,对于某些特定的处理器,代码代码空间和数据空间分离情况,代码空间有限,这种方式需要慎重处理,并做相应代码的权衡。子程序调用涉及到的复杂堆栈调用过程,可以查看ACPS专项编程。

一般为了效率我们通过宏实现代码大部分逻辑,对于不需要效率的代码,我们可以直接通过函数代用过程来完成对应的代码执行。

2. 散转功能

散转功能实际类似高级语言中switch case语句,针对不同的情况完成不同分支跳转,比方说对消息类型进行编号,不同消息类型跳转到不同的位置执行。在ARM中具体实现格式如下:

CMP     R4, #MAXINDEX
ADDL0   PC, PC, R4, LSL, #2
B       MSG_HEADLE1
B       MSG_HEADLE2
B       MSG_HEADLE3
B       MSG_HEADLE4

3. 查表操作

作为转发处理器,查表操作是非常重要的,但其查表操作是通过协处理器完成。ARM汇编查找比方说从某个数组中查出具体的某个位置的值。具体实例如下:

LDR    R3,=DSP_TAB
LDR    R2, [R3, R5, LSL 2]

/* 0 - F 字模
DSP_TAB DCD    0xC0, 0xF9, 0xA4, 0x99, 0x92
        DCD    0x82, 0xF8, 0x80, 0x90, 0x88, 0x83
        DCD    0xC6, 0xA1, 0x86, 0x8E, 0xFF

4. 长跳转

b指令:简单的程序跳转,跳转到到目标标号处执行。bl指令:带链接程序跳转,也就是要带返回地址。在发生跳转前,将当前PC-4保存到R14中。也就是返回地址存在R14中,所以可以在子程序返回时只要MOV PC, LR即可。

但是汇编代码跳转指令B对跳转目的地和自身的相对位置是有要求的,不支持全空间跳转,超出特定范围是没有办法跳转过去的。为了解决这个问题,汇编代码中给出了长跳转这种方式。具体是通过伪指令LDR PC, =LADR_FUN跳转到具体的LADR_FUN位置进行代码执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值