




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ARM汇编、汇编、C和和C+混合编程混合编程 在在C/C+程序中如果必须使用汇编指令程序中如果必须使用汇编指令来完成某些操作,可以采用两种方法:来完成某些操作,可以采用两种方法: 1.采用内嵌汇编采用内嵌汇编:即在:即在C/C+源程序中嵌入源程序中嵌入一块汇编代码;一块汇编代码; 2. 形成一个子程序形成一个子程序:C/C+程序可以调用这程序可以调用这些汇编程序来完成特定的操作。些汇编程序来完成特定的操作。内嵌汇编内嵌汇编 内嵌汇编(内嵌汇编(inline assembly)的语法)的语法如下:如下:_asm指令指令;指令指令 /* 注释注释 */指令指令内嵌汇编的指令用法内嵌汇编的指令用法
2、内嵌在内嵌在C或者或者C+程序中的程序中的ARM汇编指令与普汇编指令与普通(通(ADS)格式的)格式的ARM汇编指令有所不同。汇编指令有所不同。 CPU的内部寄存器资源使用有额外约束,以的内部寄存器资源使用有额外约束,以下讲解内嵌下讲解内嵌ARM汇编指令的用法。汇编指令的用法。ARM内嵌汇编程序的操作数内嵌汇编程序的操作数 内嵌汇编指令中作为操作数的寄存器和常量内嵌汇编指令中作为操作数的寄存器和常量可以是表达式。可以是表达式。 这些表达式可以是这些表达式可以是char,short或或int类型,类型,而且这些表达式都是作为无符号数进行操作,而且这些表达式都是作为无符号数进行操作,编译器将会计算
3、这些表达式的值,并为其分编译器将会计算这些表达式的值,并为其分配寄存器。配寄存器。ARM内嵌汇编程序的物理寄存器内嵌汇编程序的物理寄存器 内嵌汇编程序中使用物理寄存器有以下限制。内嵌汇编程序中使用物理寄存器有以下限制。1. 不能直接向不能直接向PC寄存器赋值,程序跳转只能使用寄存器赋值,程序跳转只能使用B或或BL指令实现指令实现2. 不要使用过于复杂的不要使用过于复杂的C表达式,因为将会需要较表达式,因为将会需要较多的物理寄存器,这将导致与其他指令中用到的物多的物理寄存器,这将导致与其他指令中用到的物理寄存器产生使用冲突。理寄存器产生使用冲突。 int tmp,r1; _asm MOV r1,
4、 1temp ORR tmp, tmp, #0 x80 /置置I位位 MSR CPSR_c, tmp/temp-CPSR MOV R2, #0 x00000008 ;r1R2MOV R0,R2ADD R2,R2,#0 x00000001MOV R1,R0 ;tmpR1MRS R1,CPSRORR R1,R1,#0 x00000080MSR CPSR_c,R1其他内嵌汇编程序的编写注意点其他内嵌汇编程序的编写注意点 常量:常量:在内嵌汇编指令中,常量前面的在内嵌汇编指令中,常量前面的“#”可以省可以省略。略。 指令展开:指令展开:内嵌汇编指令中,如果包含常量操作数,内嵌汇编指令中,如果包含常量操
5、作数,该指令可能被内嵌汇编器展开成几条指令。该指令可能被内嵌汇编器展开成几条指令。 标号:标号:C程序中的标号可以被内嵌的汇编指令使用,程序中的标号可以被内嵌的汇编指令使用,但是只有指令但是只有指令B可以使用可以使用C程序中的标号,而指令程序中的标号,而指令BL则不能使用。则不能使用。 内存单元的分配:内存单元的分配:所有的内存分配均由所有的内存分配均由C编译器完成,编译器完成,分配的内存单元通过变量供内嵌汇编器使用。内嵌汇分配的内存单元通过变量供内嵌汇编器使用。内嵌汇编器不支持内嵌程序中用于内存分配的伪指令。编器不支持内嵌程序中用于内存分配的伪指令。#define a 1int main(v
6、oid) char tmp; int r1=0; _asm MOV tmp, a*a MOV tmp, a=1MOV tmp, a0 xffffffff MOV tmp, r1=3 MOV R0, #0 x00000000 ;初始化初始化 MOV R2, #0 x00000001 ; MOV tmp, a*aMOV R2, #0 x00000001 ; MOV tmp, a=1MVN R2, #0 x00000001 ;MOV tmp,a0 xffffffff MOV R3,R0,LSL #3 ;MOV tmp, r1=3MOV R0,R3MOV R1,R3MOV R0,R1MOV R2,R0
7、内嵌汇编程序中的内嵌汇编程序中的SWI和和BL指令指令 SWI和和BL指令:在两个指令使用到内嵌汇指令:在两个指令使用到内嵌汇编中,除了正常的操作数域外,还必须增编中,除了正常的操作数域外,还必须增加以下加以下3个可选的寄存器列表:个可选的寄存器列表:用于输入参数的寄存器列表。用于输入参数的寄存器列表。用于存储返回结果的寄存器列表。用于存储返回结果的寄存器列表。用于表示那些寄存器将有可能会被修改用于表示那些寄存器将有可能会被修改的寄存器列表。的寄存器列表。内嵌汇编代码举例字符串复制内嵌汇编代码举例字符串复制#includevoid str_cpy(const char *src,char *d
8、st)int ch;_asmloop: /普通普通ARM汇编代码中的标号后面不能跟冒号。汇编代码中的标号后面不能跟冒号。C程序中程序中/的标号可以被内嵌的汇编指令使用。的标号可以被内嵌的汇编指令使用。 ARM内嵌汇编代码中内嵌汇编代码中/只有只有B指令可以使用指令可以使用C的标号,而的标号,而BL指令不能够使用指令不能够使用C代码代码/的标号。的标号。 C程序的标号后面跟冒号,由程序的标号后面跟冒号,由Goto语句转向标号处。语句转向标号处。LDRB ch, src, #1STRB ch, dst, #1CMP ch, #0BNEloopLDRB r2,r0,#1STRB r2,r1,#1CM
9、P r2,#0BNE pc - 0 xc ; 0 x0MOV pc,r14内嵌汇编代码举例字符串复制内嵌汇编代码举例字符串复制int main(void)const char * a=Hello world!n;char b20;_asmMOV R0,a / 将串将串a的串首地址送到的串首地址送到R0寄存器寄存器MOV R1,b / 将串将串b的串首地址送到的串首地址送到R1寄存器寄存器BL str_cpy, R0, R1 / 调用调用C函数函数str_cpy()printf(Original string: %sn,a); printf(Copied string: %sn,b); / 半主
10、机方式显示复制前半主机方式显示复制前后的两个串后的两个串return(0);STMFD r13!,r4,r14SUB r13, r13, #0 x18ADD r4, pc, #0 x2c ; #0 x50MOV r0, r4ADD r1, r13, #4BL str_cpy ; 0 x0MOV r1, r4ADD r0, pc, #0 x28 ; #0 x60BL _printfADD r1, r13, #4ADD r0, pc, #0 x34 ; #0 x78BL _printfMOV r0, #0ADD r13, r13, #0 x18LDMFD r13!, r4,pc内嵌汇编器与内嵌汇编
11、器与armasm汇编器差异汇编器差异 内嵌汇编器不支持通过内嵌汇编器不支持通过“.”指示符或指示符或PC值值来获取当前指令的地址。来获取当前指令的地址。 不支持不支持“LDR LRn,=expr”伪指令,而使伪指令,而使用用“MOV Rn,expr”指令向寄存器赋值。指令向寄存器赋值。 不支持标号表达式。不支持标号表达式。 不支持不支持ADR和和ADRL伪指令。伪指令。 不支持不支持BX指令。指令。 不能向不能向PC直接赋值。直接赋值。 当使用当使用8位移位常数导致位移位常数导致CPSR的的ALU标志标志更新时,更新时,N、Z、C和和V标志中的标志中的C不具有真不具有真实意义。实意义。 C/C
12、+程序与程序与ARM汇编语言程序汇编语言程序的相互调用的相互调用 C/C+程序与汇编程序相互调用时,应遵程序与汇编程序相互调用时,应遵守相应的守相应的ATPCS,主要有五种调用。,主要有五种调用。 ARM汇编子程序调用汇编子程序调用C语言子程序语言子程序 ARM汇编子程序调用汇编子程序调用C+语言子程序语言子程序 C语言程序调用语言程序调用ARM汇编语言子程序汇编语言子程序 C+语言程序调用语言程序调用ARM汇编语言子程序汇编语言子程序 C语言程序调用语言程序调用C+语言子程序语言子程序ATPCS ATPCS(ARM-Thumb Procedure Call Standard)规定了一些子程序
13、间调用的基本规)规定了一些子程序间调用的基本规则。则。 使用使用ADS的的C语言编译器编译的语言编译器编译的C语言子程序语言子程序满足用户指定的满足用户指定的ATPCS类型。而对于汇编语言类型。而对于汇编语言来说,则需要用户来保证各个子程序满足来说,则需要用户来保证各个子程序满足ATPCS的要求。的要求。AAPCS 2007年年ARM公司正式推出了公司正式推出了AAPCS标准标准 ARM Archtecture Procedure Call Standard AAPCS是是ATPCS的改进版的改进版 目前,目前, AAPCS和和ATPCS都是可用的标准都是可用的标准寄存器的使用规则寄存器的使用
14、规则 子程序间通过寄存器子程序间通过寄存器R0R3来传递参数。这来传递参数。这时,寄存器时,寄存器R0R3可记作可记作a0a3。 在子程序中,使用寄存器在子程序中,使用寄存器R4R11来保存局来保存局部变量。这时,寄存器部变量。这时,寄存器R4R11可以记作可以记作v1v8。 寄存器寄存器R12用作过程调用中间临时寄存器,记用作过程调用中间临时寄存器,记作作IP。在子程序之间的连接代码段中常常有这。在子程序之间的连接代码段中常常有这种使用规则。种使用规则。寄存器的使用规则(续)寄存器的使用规则(续) 寄存器寄存器R13用作堆栈指针,记作用作堆栈指针,记作SP。寄存器。寄存器SP在进在进入子程序
15、时的值和退出子程序时的值必须相等。入子程序时的值和退出子程序时的值必须相等。 寄存器寄存器R14称为连接寄存器,记作称为连接寄存器,记作LR。它用于保存。它用于保存子程序的返回地址。如果在子程序中保存了返回地子程序的返回地址。如果在子程序中保存了返回地址,寄存器址,寄存器R14则可以用作其他用途。则可以用作其他用途。 寄存器寄存器R15是程序计数器,记作是程序计数器,记作PC。它不能用作其。它不能用作其它用途。它用途。堆栈使用规则堆栈使用规则 ATPCS规定堆栈为规定堆栈为FD类型,即满递减堆栈,并类型,即满递减堆栈,并且对堆栈的操作是且对堆栈的操作是8字节对齐。字节对齐。 对于汇编程序来说,
16、如果目标文件中包含了外对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:部调用,则必须满足下列条件:(1)外部接口的堆栈必须是)外部接口的堆栈必须是8字节对齐的。字节对齐的。 (2)在汇编程序中使用)在汇编程序中使用PRESERVE8伪指令伪指令告诉连接器,本汇编程序数据是告诉连接器,本汇编程序数据是8字节对齐的。字节对齐的。参数个数可变子程序参数传参数个数可变子程序参数传递规则递规则 在传递参数时,依次将各字数据传递到寄存在传递参数时,依次将各字数据传递到寄存器器R0,R1,R2和和R3中。中。 如果参数多于如果参数多于4个,则将剩余的字数据传递个,则将剩余的字数据传递到堆
17、栈中。入栈的顺序与参数传递顺序相反,到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。即最后一个字数据先入栈。子程序结果返回规则子程序结果返回规则结果为一个结果为一个32位整数时,可以通过寄存器位整数时,可以通过寄存器R0返回;返回;结果为一个结果为一个64位整数时,可以通过寄存器位整数时,可以通过寄存器R0和和Rl返回;返回;结果为一个浮点数时,可以通过浮点运算部件结果为一个浮点数时,可以通过浮点运算部件的寄存器的寄存器f0、d0或或s0来返回;来返回;对于位数更多的结果,需要通过内存来传递。对于位数更多的结果,需要通过内存来传递。C/C+程序调用程序调用ARM汇编子程序汇编子
18、程序要点要点 设计汇编程序必须遵守设计汇编程序必须遵守ATPCS,保证程序调用时,保证程序调用时参数的正确传递。参数的正确传递。 在汇编程序中使用在汇编程序中使用EXPORT指示符声明本程序可指示符声明本程序可以被别的程序调用。以被别的程序调用。 在在C语言程序中使用语言程序中使用extern关键词声明该汇编程关键词声明该汇编程序可以被调用,序可以被调用,C+语言程序使用语言程序使用extern “C”来来声明该汇编程序可以被调用。声明该汇编程序可以被调用。例例1 C程序调用程序调用ARM汇编子程序汇编子程序/* main_0522.c semihosting output mode */#i
19、nclude extern int asmfile(int arg1, int arg2, int arg3);int main(void)int a1=1,a2=2,a3=4;printf(Example of C Program calling Assembly program!n);printf(%d + %d + %d) * 600 = %dn,a1,a2,a3,asmfile( a1, a2, a3);return(0);C程序调用程序调用ARM汇编子程序汇编子程序(续); ASM_0522.s EXPORT asmfile AREA My_pro, CODE, READONLYas
20、mfileSTMFD SP!, R4-R6,R8,R7 add r0, r0, r1add r0, r0, r2mov r4, #600mul r3, r0, r4mov r0, r3LDMFD SP!, R4-R6,R8,R7mov pc, lrEND例例2 ARM汇编程序调用汇编程序调用C语言子语言子程序程序 本案例程序比较两个本案例程序比较两个IP地址的大小,地址的大小,a1a4存放存放IP地址地址1的值(按照的值(按照ATPCS传递参数),传递参数),b1b4存放存放IP地址地址2的值(通过栈传递参的值(通过栈传递参数),如果数),如果IP地址地址1的值大于的值大于IP地址地址2的值则
21、的值则返回返回1,如果,如果IP地址地址1的值小于的值小于IP地址地址2的值的值则返回则返回-1 ,如果两者相等则返回零。,如果两者相等则返回零。 IP地址地址1取值:取值:192.168.1.152 IP地址地址2取值:取值: 172.0.0.151 例例2 ARM汇编程序调用汇编程序调用C子程序子程序/* C代码部分代码部分 */#include extern int function(void); /* 声明声明function是外部函数是外部函数 */int compare_ip(int a1, int a2, int a3, int a4, int b1, int b2, int b
22、3, int b4)if(a1!=b1)return a1b1?1:-1;if(a2!=b2)return a2b2?1:-1;if(a3!=b3)return a3b3?1:-1;if(a4!=b4)return a4b4?1:-1;return 0; int main()printf(This is a example of semihostingn);printf(result is %dn,function(); 例例2 ARM汇编调用汇编调用C子程序子程序AREA FUNCTION, CODE, READONLY ;ARM汇编子程序汇编子程序IMPORT compare_ipEXPO
23、RT functionfunctionSTMFDr13!,r0-r3,r14;保存寄存器到栈区保存寄存器到栈区MOVr3,#0 x97 ;存入存入IP地址地址2的的4个数个数, 0 x97=151MOVr2,#0; 存入存入0MOVr1,#0; 存入存入0MOVr0,#0 xac; 存入存入0 xac=172STMIAr13, r0-r3; R0-R3覆盖存入栈区的覆盖存入栈区的R0-R3位置位置MOVr3,#0 x98; 存入存入IP地址地址1的的4个数个数, 0 x98=152MOVr2,#1; 存入存入1MOVr1,#0 xa8 ; 存入存入0 xa8=168MOVr0,#0 xc0;
24、存入存入0 xc0=192BLcompare_ip ; 调用调用C语言函数进行语言函数进行IP值比较值比较ADDr13,r13,#0 x10 ; 栈指针上移栈指针上移4个字(元素)个字(元素)LDRpc,r13,#4; 将保存的将保存的r14值加载到值加载到PC,而后,而后r13加加4END例例2 ARM汇编调用汇编调用C子程序子程序 ARM汇编语言子程序汇编语言子程序Function的栈区操作图解的栈区操作图解ARM汇编(子)程序的相互调用汇编(子)程序的相互调用 基本要点:基本要点: 如果一个如果一个ARM汇编语言程序文件含有调用外部汇汇编语言程序文件含有调用外部汇编语言程序文件中子程序(
25、函数)的指令,则需编语言程序文件中子程序(函数)的指令,则需要用要用IMPORT指示符来指明将要调用的子程序名称。指示符来指明将要调用的子程序名称。 如果本汇编语言程序文件中的某个子程序(函如果本汇编语言程序文件中的某个子程序(函数),需要被外部的数),需要被外部的ARM汇编语言程序文件中的汇编语言程序文件中的语句调用,则需要用语句调用,则需要用EXPORT指示符来指明将要指示符来指明将要被调用的子程序(函数)名称。被调用的子程序(函数)名称。 被执行的汇编子程序在运行前,要注意将寄存器被执行的汇编子程序在运行前,要注意将寄存器组压入栈区,返回时要注意将栈区保存的工作现组压入栈区,返回时要注意
26、将栈区保存的工作现场恢复到处理器的寄存器组。场恢复到处理器的寄存器组。例例3 ARM汇编子程序嵌套调用汇编子程序嵌套调用 这里给出的这里给出的ARM汇编程序嵌套调用范例程序做汇编程序嵌套调用范例程序做如下计算:如下计算:求自然数求自然数1到到n的阶乘的总和的阶乘的总和例例3 ARM汇编子程序嵌套调用汇编子程序嵌套调用#include extern int asmFac(int n);struct factorial_sumint cal_fn;int sum_fn;int fn9;extern struct factorial_sum * summing(struct factorial_su
27、m * arg1);例例3 ARM汇编子程序嵌套调用汇编子程序嵌套调用int main(void) int j;struct factorial_sum fac= 9, 0, 1,1,1,1,1,1,1,1,1; /设置参数设置参数struct factorial_sum * result;/申请变量作为返回值申请变量作为返回值printf(Example of a multi Assembly program calling !n);result=summing(&fac); /调用求和函数调用求和函数 R0存放的是存放的是FAC变量变量的首地址的首地址printf(The tota
28、l sum is %dn, result-sum_fn);/输出结果输出结果for(j=0; jfn)j);例例3 ARM汇编子程序嵌套调用汇编子程序嵌套调用EXPORT summing IMPORT asmFac;说明用到了其他文件中的子汇编程序说明用到了其他文件中的子汇编程序 AREA SUMMING, CODE, READONLYsumming stmfd sp!, r4-r5ldr r1, r0;r1=cal_fnmov r2, #1;将将r2设置为当前需要计算的阶乘数设置为当前需要计算的阶乘数,;它从它从1变化到变化到cal_fnadd r3, r0, #8 ;将将r3指向指向fn数
29、组数组movr5, #0 ;r5为总和为总和,初始值置为初始值置为0loopcmpr1, r2;将将cal_fn与当前所需计算的阶乘值比较与当前所需计算的阶乘值比较bltback;如果小于如果小于,则返回则返回例例3 ARM汇编子程序嵌套调用汇编子程序嵌套调用 STMFD sp!, r0-r3,lr ;保存保存r0r3,lr ;因为调用了外部文件的汇编子程序因为调用了外部文件的汇编子程序movr0, r2;将将r0设置为当前所需计算的阶乘值设置为当前所需计算的阶乘值blasmFac;调用阶乘函数调用阶乘函数movr4, r0;将返回值将返回值(阶乘阶乘)存在存在r4中中ldmfd SP!, R
30、0-R3,lr;恢复先前保存的寄存器值恢复先前保存的寄存器值strr4, r3;将计算所得的阶乘值存入数组中将计算所得的阶乘值存入数组中addr3, r3, #4;将将r3指向数组的下一个指向数组的下一个addr5, r5, r4;将阶乘值加入总和将阶乘值加入总和addr2, r2, #1;计算下一个阶乘计算下一个阶乘b loop;循环循环backstrr5, r0, #4;将计算所得的总和存入结构体中将计算所得的总和存入结构体中ldmfd SP!, R4-R5 ;恢复寄存器值恢复寄存器值movpc, lr; summing子程序子程序返回返回END;汇编代码结束汇编代码结束例例3 ARM汇编
31、子程序嵌套调用汇编子程序嵌套调用;这个这个ARM汇编函数也可以被汇编函数也可以被C函数调用,符合函数调用,符合ATPCS规范规范;int asmFac(int n) EXPORT asmFac AREA ASMFILE, CODE, READONLYasmFacmovr1, r0 ;r1=nloopsubs r1, r1, #1 ;将将r1减减1 mulgt r0, r1, r0 ;如果大于如果大于0,则乘上则乘上r1(相当与相当与n*(n-1)bgtloop ;如果大于如果大于0,继续继续mov pc, lr ;asmFac子程序返回子程序返回END ;汇编代码结束汇编代码结束例例4 ARM
32、汇编子程序嵌套调用汇编子程序嵌套调用#include int main()printf(Hello worldn);return 0;Example7_asm.sAREA Asm_C,CODE,READONLYENTRYLDRSP,=0 x4000IMPORT_mainBL_mainB.END系统的初始化过程系统的初始化过程 初始化代码初始化代码:在用户的应用程序运行之前完成系统初始化工作的代码在用户的应用程序运行之前完成系统初始化工作的代码初始化代码直接对初始化代码直接对ARM微处理器内核及硬件控制器编程,多采用汇编语微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包含如下
33、典型任务:言编程,初始化代码一般应包含如下典型任务:l 定义程序入口点定义程序入口点l 设置异常向量设置异常向量l 初始化存储器系统初始化存储器系统l 初始化堆栈指针寄存器初始化堆栈指针寄存器l 初始化临界初始化临界I/O设备设备l 初始化初始化C代码的运行环境代码的运行环境l 改变处理器的运行模式和状态改变处理器的运行模式和状态l 使能中断使能中断l 进入进入C代码运行代码运行系统的初始化过程系统的初始化过程ARM微处理器在复位或上电状态下的默认模式为管理微处理器在复位或上电状态下的默认模式为管理模式(模式(Supervisor Mode),而在初始化代码中可能需),而在初始化代码中可能需要
34、切换到其他模式进行必要的操作,如初始化各个模式要切换到其他模式进行必要的操作,如初始化各个模式下的堆栈指针寄存器,因此,在系统的初始化过程中处下的堆栈指针寄存器,因此,在系统的初始化过程中处理器模式一般会经历如下变化:理器模式一般会经历如下变化:(1)初始化存储设备初始化存储设备(2)初始化堆栈空间初始化堆栈空间(3)初始化必要的硬件设备初始化必要的硬件设备(1)汇编程序入口汇编程序入口(2)系统初始化,设置中断向量系统初始化,设置中断向量(3)关看门狗及中断关看门狗及中断IMPORT _mainLDR lr, =_mainMOV pc,lr_main_scatterload(1)把把RW/R
35、O段从装载段从装载域复制到相应的域复制到相应的RAM中中(即运行域)(即运行域)(2)初始化初始化ZI段段_rt_entry(1)初始化库函数初始化库函数(2)建立堆栈建立堆栈(3)调用调用main()(4)退出应用退出应用(5)用用main()函数的返回值做函数的返回值做为为exit()参数参数 main()系统的初始化过程系统的初始化过程u 进入进入C代码运行代码运行 最简单的情况:最简单的情况:IMPORTC_Entry ;定义一个外部标号,一般不使用;定义一个外部标号,一般不使用mainBC_Entry ;跳转到该处执行;跳转到该处执行在在ARM的的ADS编译环境中,还另外提供了一种进
36、入编译环境中,还另外提供了一种进入C代码的机制:代码的机制:IMPORT_mainB_main_main( )是编译器提供的一个函数,负责完成库函数的初始化和对是编译器提供的一个函数,负责完成库函数的初始化和对C代码运行环境代码运行环境的初始化,最后自动跳转到的初始化,最后自动跳转到main( )函数执行,此时应用程序的主函数名必须是函数执行,此时应用程序的主函数名必须是main( )。用户可以根据需要选择是否使用用户可以根据需要选择是否使用_main( )函数,如果想让系统自动完成初始化过程,函数,如果想让系统自动完成初始化过程,可以使用可以使用_ main( )函数;如果所有的初始化过程都
37、由用户自己完成,则不使用函数;如果所有的初始化过程都由用户自己完成,则不使用_ main( )函数。函数。系统的初始化过程系统的初始化过程u定义程序入口点定义程序入口点初始化代码必须定义整个程序的入口点(初始化代码必须定义整个程序的入口点(Entry Point)伪操作伪操作Entry链接器的设置链接器的设置确定整个程序的入口点确定整个程序的入口点系统的初始化过程系统的初始化过程u 设置异常向量设置异常向量 AREA Init,CODE,READONLYENTRYBReset_HandlerBUndef_HandlerBSWI_HandlerBPreAbort_HandlerBDataAbor
38、t_HandlerB.BIRQ_HandlerBFIQ_HandlerReset_Handler 系统的初始化过程系统的初始化过程u初始化存储器系统初始化存储器系统 初始化存储器系统主要包含对系统存储器控制器的初始初始化存储器系统主要包含对系统存储器控制器的初始化,如果系统具有存储器管理单元(化,如果系统具有存储器管理单元(MMU),也必须对也必须对其进行初始化。其进行初始化。基于基于ARM微处理器的系统一般都需要外扩大容量的存微处理器的系统一般都需要外扩大容量的存储器,这些存储器需要专门的存储器控制器控制其读、储器,这些存储器需要专门的存储器控制器控制其读、写操作。写操作。系统的初始化过程系
39、统的初始化过程u存储器的地址分配与地址重映射(存储器的地址分配与地址重映射(Remap)存储器的地址分配也就是将物理存储器定位在存储器的地址分配也就是将物理存储器定位在4GB地址空间的具体位置地址空间的具体位置ARM微处理器常采用两种方式来完成地址分配微处理器常采用两种方式来完成地址分配:l 固定的存储器地址分配固定的存储器地址分配l 存储器地址重映射(存储器地址重映射(Remap)系统的初始化过程系统的初始化过程FLASH中断向量表中断向量表程序程序(RO)RAM堆栈堆栈数据数据数据数据(RO)FLASH中断向量表中断向量表程序程序(RO)内部内部RAM数据数据(RW)内部内部RAM中断向量表中断向量表FLASH堆栈堆栈程序程序数据数据外部外部SRAMSDRAM外部外部SRAMSDRAM4G存储空间存储空间4G存储空间存储空间4G存储空间存储空间固定的存储器地址分配固定的存储器地址分配存储器地址重映射(存储器地址重映射(Remap)系统的初始化过程系统的初始化过程u初始化堆栈指针寄存器初始化堆栈指针寄存器 SP_svcSP_irqSP_fiqSP_abtSP_undS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024国际物流师技术优化考题分享试题及答案
- 安全工程师必知的国际标准试题及答案
- 2025年铁基记忆合金材料合作协议书
- 工程建设安全规程试题及答案分享
- 提升学习效率CPMM试题及答案
- 厦门广告牌制作施工方案
- 2025年蓄热式高温预热烧嘴项目合作计划书
- 2025天津市建筑工程职工大学辅导员考试题库
- 2025四川职业技术学院辅导员考试题库
- 2025青岛求实职业技术学院辅导员考试题库
- 不良事件上报制度及流程
- 临床常见护理纠纷与处理技巧
- wps国家计算机二级真题单选题100道及答案
- 同时性结直肠癌肝转移治疗进展
- 总监理工程师代表安全监理职责
- 钢筋安装施工技术交底
- GB/T 44990-2024激光熔覆修复层界面结合强度试验方法
- 《伤逝》介绍课件
- 《电梯维保规则》课件
- 华为错混料预防管理
- 5.1 人民代表大会:我国的国家权力机关 课件-高中政治统编版必修三政治与法治-1
评论
0/150
提交评论