系统 :ubuntu 16.04
硬件平台:S3C2440
编译器 :arm-linux-gcc 4.5.1
一、几条重要汇编代码
指令 | 解释 |
mov Rn,Rm | 把寄存器Rm存入寄存器Rn |
ldr Rn,Rm | 把寄存器Rm存入寄存器Rn |
str Rn,Rm | 把寄存器Rn存入寄存器Rm |
stm{条件} Rn{!} {Rm1,Rm2...Rm3...Rmn}^ 条件:IA(先存后加) IB(先加后存) DA(先存后减) DB(先减后存) ! :决定最后寄存器Rn操作之后的值是否回写寄存器Rn ^ :当列表{Rm1,Rm2...Rm3}中有R15(PC)时,有^符号表示把寄存器SPSR存入寄存器CPSR | 按照寄存器序号大小(不用考虑排列顺序而是看下标m1 m2 m3的大小)依次把寄存器Rm1 ....Rmn中的值存入寄存器Rn中。其中高序列寄存器放在Rn高地址,低序列寄存器存放在寄存器Rn低地址。 |
ldm{条件} Rn{!} {}^ 解释 同上 | 按照寄存器序号大小(不用考虑排列顺序而是看下标m1 m2 m3的大小)依次把寄存器Rn中值存入寄存器Rm1 ....Rmn。其中Rn高地址中的值存放在高序列寄存器,寄存器Rn低地址中的值存放在低序列寄存器。 |
bl address | 跳转到地址address处执行,同时链接寄存器lr存放下一条指令。 |
b address | 跳转到地址address处执行。 |
下面举例说明上述代码:
1. mov r0,r1 把r1中的值存入寄存器r0
mov r0,#4 把立即数4存入寄存器r0
2. ldr r0,r1 把r1中的值存入寄存器r0
ldr r0,#4 把立即数4存入寄存器r0
ldr r0,=#4 把立即数4存入寄存器r0,这是一条伪代码,会被编译器翻译成多条汇编代码,如果立即数大于某个数,上一条代码就不能使用。应该用本条代码。
3. str r0,r1 把r0中的值存入寄存器r1
4. stmdb sp! {r11,r15,r14}^
假设sp = 4096 ,有如下详细步骤
第一步: sp = sp-4 = 4092 把r15中的值存入sp所指向的内存单元内,也就是4092内存单元
第二步:sp = sp - 4 =4088,把r14中的值存入sp所指向的内存单元内,也就是4088内存单元
第二步:sp = sp - 4 =4084,把r11中的值存入sp所指向的内存单元内,也就是4084内存单元
最后:sp = 4084,且把寄存器spsr存入cpsr中
ldmia sp {r11,r15,r14}
假设sp = 4084 ,有如下详细步骤
第一步: 把sp所指向的内存单元内的值也就是4084内存单元的值,存入r15中,然后sp = sp+4 = 4088
第二步:把sp所指向的内存单元内的值也就是4088内存单元的值,存入r14中,然后sp = sp+4 = 4092
第二步:把sp所指向的内存单元内的值也就是4092内存单元的值,存入r11中,然后sp = sp+4 = 4096
最后:sp = 4084,没有把寄存器spsr存入cpsr中
二、写裸机代码
写裸机代码有如下顺序
1.看原理图,找对应引脚
2.看芯片手册,看引脚对应寄存器配置
3.写代码测试
原理图如下:
芯片手册
代码测试:
/*
*点亮led:GPF4
*
* 配置GPF4为输出引脚
* 设置GPF4输出为高电平
* 0x100 -> 0x5600 0050
**/
.text
.global _start
_start:
LDR R0,=0X56000050
MOV R1,#0X100
STR R1,[R0]
LDR R0,=0X56000054
MOV R1,#0
STR R1,[R0]
WAIT:
B WAIT
下面来观测一下反汇编语句:
Disassembly of section .text:
00000000 <_start>: 代码解释:
0: e59f0014 ldr r0, [pc, #20] ; 1c <WAIT+0x4> 把地址1c处的数据(56000050)存入r0中
4: e3a01c01 mov r1, #256 ; 0x100 把立即数256存入r1中
8: e5801000 str r1, [r0] 把r1中的数据存入地址56000050指向的内存中
c: e59f000c ldr r0, [pc, #12] ; 20 <WAIT+0x8> 把地址20处的数据(56000054)存入r0中
10: e3a01000 mov r1, #0 把立即数0存入r1中
14: e5801000 str r1, [r0] 把r1中的sh存入地址56000050指向的内存中
00000018 <WAIT>:
18: eafffffe b 18 <WAIT>
1c: 56000050 undefined instruction 0x56000050
20: 56000054 undefined instruction 0x56000054