ARM汇编言语程序格局
可履行映象文件的格局:*.axm *.bin *.elf *.hex
代码段示例:
汇编言语源程序的根本结构:
AREA Init,CODE,READONLY
ENTRY
Start
LDR R0,=0x3FF50000
LDR R1,0xFF
STR R1,[R0]
LDR R0,=0x3FF5008
LDR R1,0x01
STR R1,[R0]
END
Arm体系结构3种履行流程:
1次序履行
2跳转履行
3异常中断履行
Arm子程序调用运用指令BL子程序称号
子程序调用示例:
AREA Init,CODE,READONLY
ENTRY
Start
LDR R0,=0x3FF5000
LDR R1,0xFF
STR R1,[R0]
LDR R0,=0x3FF5008
LDR R1,0x01
STR R1,[R0]
BL PRINT_TEXT
┉┉
PRINT_TEXT
┉┉
MOV PC,LR
┉┉
END
C/C++及汇编言语的混合编程
ARM集成开发环境中包括的C/C++编译器。
编译器 称号 |
编译器 品种 |
源文件 类型 |
源文件 后缀 |
输出方针文件类型 |
armcc |
C |
C |
*.C |
32位ARM代码 |
tcc |
C |
C |
*.C |
16位Thumb代码 |
armcpp |
C++ |
C/C++ |
*.C/*.C++ |
32位ARM代码 |
tcpp |
C++ |
C/C++ |
*.C/*.C++ |
16位Thumb代码 |
在C\C++程序中运用内嵌的汇编指令的语法格局:
在ARM C言语程序中,运用关键字__asm来标识一段汇
编指令程序。
__asm;2个下划线
{
汇编言语程序
~~~~~~~~
汇编言语程序
}
其间:假如一行中有多个汇编指令,指令之间运用分号(;)分隔。
在一条指令占多行,要运用续行符号(\).
在C/C++程序中内嵌汇编指令注意事项:
o有必要当心运用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V标志位.由于核算汇编代码中的C表达式时,可能会运用这些物理寄存器,并会修正N,Z,C,V标志位。
__asm
{
MOV R0,x
ADD y,R0,x/y //核算x/y时R0会被修正
}
在核算x/y时R0会被修正,然后影响R0+x/y的成果.用一个C程序的变量替代
R0就能够处理这个问题:
__asm
{
MOV var,x
ADD y,var,x/y
}
内嵌汇编器探测到隐含的寄存器抵触就会报错.
o不要运用寄存器替代变量.虽然有时寄存器显着对应某个变量,但也不能直接运用寄存器替代变量.
int bad_f(int x) //x寄存在R0中
{
__asm
{
ADD R0,R0,#1 //产生寄存器抵触,实际上x的值没有改变
}
return(x);
}
虽然依据编译器的编译规矩好像能够确认R0对应x,但这样的代码会使内嵌汇编器以为
产生了寄存器抵触.用其他寄存器替代R0寄存参数x,使得该函数将x原封不动地回来.
这段代码的正确写法如下:
int bad_f(intx)
{
__asm
{
ADD x,x,#1
}
return(x)
}
从汇编程序中拜访C程序变量
在C程序中声明的全局变量能够被汇编程序经过地址直接拜访。详细拜访方
法如下:
o运用IMPORT伪指令声明这个全局变量。
o运用LDR指令读取该全局变量的内存地址,一般该全局变量的内存地址寄存在程序的数据缓冲池中。
o依据该数据类型,运用相应的LDR指令读取该全局变量的值;运用相应的STR指令修正该全局变量的值。
AREAglobals,CODE,READONLY
EXPORT asmsub
IMPORTglovbvar;声明外部变量glovbvar
asmsub
LDR R1,=glovbvar;装载变量地址
LDR R0,[R1];读出数据
ADD R0,R0,#1;加1操作
STR R0,[R1];保存变量值
MOV PC, LR
END
C程序与汇编程序相互调用规矩
寄存器的运用规矩
- 子程序间经过寄存器R0~R3来传递参数。
- 在子程序中,运用寄存器R4~R11来保存局部变量。
- 寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数回来时运用该寄存器出桟),记作IP。
- 寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值有必要持平。
- 寄存器R14称为链接寄存器,记作LR。它用于保存子程序的回来地址。
- 寄存器R15是程序计数器,记作PC
*.axf(下载到sdram里边调试(AXD))
ARM fromelf(转化)—->*.bin*.elf*.hex*.i32烧写到flash里边保存
1.将映象文件(*.axf)下载到SDRAM内调试,东西为JTAG板或许仿真器.
RO BASE:设置SDRAM内的地址,能够设置SDRAM的首地址,或许是接近首
地址值的地址值,RO BASE的值一定要依照字对齐.
RW BASE:也能够不设置,假如要设置,RW BASE –RO BASE >映象文件的大下
最好不设置,值一定要依照字对齐.
2.将映象文件(*.bin *.hex)烧写到nor flash内
RO BASE:设置flash首地址(0x00000000),值一定要依照字对齐.
RW BASE:一定要设置,设置的地址值在SD RAM内,值一定要依照字对齐.
IMAGE ENTRY POINT:能够不设置,假如设置就和RO BASE的值.
PLACE AT BEGINNING OF IMAGE
Object/Symbol:填写映象文件中,第一个要履行的源文件的方针文件.
(异常中断的跳转函数)