专题**-ARM汇编语言得玩转

位操作特性

范例1:var = 1; //第一位被置1,其他位都会被置0
范例2:var |= 1; //第一位被置1,其他位不变

为什么要学习使用汇编程序?

嵌入式中汇编程序的主要用途:bootloader,内核

ARM汇编分类:ARM标准汇编,GNU汇编

GNU汇编程序基本框架

.section  .data
    <初始化的数据>
.section  .bss
    <未初始化的数据>
.section  .text
.global  _start
_start:
    <汇编代码>
.section .text
.global _start
_start:
        mov r1,#1
        mov r2,#2
        mov r3,#3

链接地址:arm-linux-ld -Ttext 0x30000000 led.o -o led.elf
链接器脚本:arm-linux-ld Tled.lds led.o -o led.elf

算术和逻辑指令

mov{cond}{S}  <dst>, <src>
mov  r1, #8                     @#代表立即数

mvn{cond}{S}  <dst>, <src>      @将src取反之后赋值给dst
mvn  r1, #0b10                      @r1 = ~(0b10);

sub{cond}{S}  <dst>, <src>, <op1>
mov  r2,#4
sub  r1,r2,#2                       @r1=r2-2;

add{cond}{S}  <dst>, <src>, <op1>
add  r1, r2,#3                      @r1=r2+3;

and{cond}{S}  <dst>, <src>, <op1>
and  r1, r2,#3                      @r1=(r2&3);

orr  r1, #0b100 

bic{cond}{S}  <dst>, <src>, <op1>
bic  r1, r2, #0b1010                @将src第1,3位清0后赋值给r1

比较指令

cmp{cond}{S}  <dst>, <src>
cmp  r1,#3                      @比较,并修改程序状态字寄存器(CPSR)相应位

tst{cond}{S}  <op1>, <op2>  @测试位:status=op1&op2
mov  r1, #0b101
tst  r1, #0b001             @status结果!=0,所以CPSR的Z位就不会被置1.

跳转指令

b{cond}  table      @跳转但不返回
bl{cond}  table @跳转并返回

函数返回指令: mov pc, lr
为了举例,下面是 Intel 8086 处理器分支指令的一个列表:
JA Jump if Above
JAE Jump if Above or Equal
JB Jump if Below
JBE Jump if Below or Equal
JC Jump if Carry
JCXZ Jump if CX Zero (CX is a register that can be used for loop counts)
JE Jump if Equal
JG Jump if Greater than
JGE Jump if Greater than or Equal
JL Jump if Less than
JLE Jump if Less Than or Equal
JMP JuMP
JNA Jump if Not Above
JNAE Jump if Not Above or Equal
JNB Jump if Not Below
JNBE Jump if Not Below or Equal
JNC Jump if No Carry
JNE Jump if Not Equal
JNG Jump if Not Greater than
JNGE Jump if Not Greater than or Equal
JNL Jump if Not Less than
JNLE Jump if Not Less than or Equal
JNO Jump if Not Overflow
JNP Jump if Not Parity
JNS Jump if Not Sign
JNZ Jump if Not Zero
JO Jump if Overflow
JP Jump if Parity
JPE Jump if Parity Even
JPO Jump if Parity Odd
JS Jump if Sign
JZ Jump if Zero

80386 添加了:
JECXZ Jump if ECX Zero
作为对比,ARM 处理器只提供了:
B 分支
BL 带连接的分支
但 ARM 提供了条件执行,你可以不受这个表面上不灵活的方式的限制:
BEQ Branch if EQual
BNE Branch if Not Equal
BVS Branch if oVerflow Set
BVC Branch if oVerflow Clear
BHI Branch if HIgher
BLS Branch if Lower or the Same
BPL Branch if PLus
BMI Branch if MInus
BCS Branch if Carry Set
BCC Branch if Carry Clear
BGE Branch if Greater than or Equal
BGT Branch if Greater Than
BLE Branch if Less than or Equal
BLT Branch if Less Than

BLEQ Branch with Link if EQual
….
BLLT Branch with Link if Less Than

移位指令

lsl
mov  r1,r1,lsl#2        @左移2位
ror
mov  r1,r1,ror#1        @循环右移1位

程序状态字访问指令

mrs  r1, cpsr           @读出CPSR
orr  r1, #0b100 
msr  cpsr, r1           @写入CPSR

存储器访问指令

ldr  r0, #0x41000000    @载入寄存器(load)
orr  r0, #0x0b1100
str  r0, [r1]           @写入寄存器(str)

ARM指令机器码设计

ARM架构参考手册 》ARM instruction Set
通过对mov和moveq指令的反汇编来获取机器码,
通过机器码对照上面手册中相应位置的格式来分析mov的机器码

定义类伪指令
伪指令:伪指令本身并没有对应的机器码,它只在编译时起作用或者转化为其他实际指令。

.global table @把该标签定义为全局以便其他文件来调用它

.data @查看是否存在数据段中:readelf -a xxx.elf 找到数据段起始地址
hello:
.ascii “hello,world”
byte_var1:
.byte 0x1
word_var2:
.word 0xcf

.equ LEN, 0x16 @定义一个宏LEN,值为0x16
使用这个宏: mov r0, #LEN

.align 4 @以下代码4字节对齐.(能够被4整除)

操作类伪指令

nop @空操作伪指令,用来延时(就是mov r0,r0)

mov r0, #0xabcdef @此处编译会出错,op1超过限制二进制位8位了。
ldr r0, =0xabcdef @此处可以取代mov来传送比较大的数据
ldr伪指令实质:
ldr r0, [pc, #-4] @0x30008008 <_start+0x8>
.word 0x00abcdef

伪指令LDR:

ldr  r0, =WTCON     @装载WTCON值
指令LDR:
ldr  r0, WTCON          @装载WTCON所处地址

ARM协处理器访问指令

参考手册: ARM核手册:关键字:CP15
协处理器作用:通过协处理器减轻CPU负担,比如数学协处理器可以控制数字处理。ARM最多支持16个协处理器,其中CP15是最重要的一个。

CP15作用:
The system control coprocessor, CP15, which provides additional registers
that are used to configure and control the caches, MMU, protection system,
the clocking mode, and other system options of the ARM920T, such as big
or little-endian operation.

我们访问一个新寄存器方法
首先我们必须要去了解它到底蕴含了什么含义在里面,也就是说我们通过这个寄存器的访问能够对我们的系统造成一些什么样的影响,这个寄存器里面包含的是一些什么样的信息。
我们如何来访问这个寄存器,也就是我们要通过什么指令来访问该寄存器。

CP15访问指令
mrc{cond} p15,,,,, @读cp15
mcr{cond} p15,,,,, @写cp15
具体操作参考ARM核手册来操作具体寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值