五、c语言与汇编语言混合编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
2、 C程序调用汇编程序
第一步:建立汇编源文件Factorial.s
/* Factorial.s */ AREA Fctrl, CODE, READONLY EXPORT Factorial Factorial MOV R8 , R0 MOV R9 , #0 SUB R0,R8,#1 Loop MOV R1 , R9 UMULL R8 , R9 , R0 , R8 MLA R9 , R1 , R0 , R9 SUBS R0 , R0 , #1 BNE Loop LDR R0,=0xFFFFFFF0 STMIA R0,{R8,R9} MOV PC,LR MOV PC,LR ; 声明代码段 Fctrl

在ARM开发工具编译环境下设计程序,用ARM 汇编语言调用C语言实现20!的阶乘操作,并将 结果保存到寄存器R0中。
4ห้องสมุดไป่ตู้
1、汇编程序调用C程序
然后建立C语言源文件factorial.c
/* factorial.c */ long long Factorial(char N) { char i; long long Nx=1; for(i=1;i<=N;i++)Nx=Nx*i; return Nx; }
初始化过程
初始化存储器及 SDRAM 初始化堆栈
设置异常向量 初始化C语言运行环 境:设置参数 改变CPU运行模式为用 户模式(User Mode) 运行C程序
15
//内嵌汇编标识
13
本章提要
一 ARM微处理器体系结构 二 ARM 微处理器指令集 三 C语言与汇编语言的混合编程 四 ARM处理器初始化分析
14
应用示例-系统初始化
复位动作
复位 1.R14_svc=PC 2.SPSR_svc=CPSR 3.SPC和SPSR未定义 4.CPSR的M[4:0]=10011 5.CPSR的I,F位置1 6.CPSR的T位置1 7.PC=0 8.在ARM模式下执行0位 置的指令
11
ARM开发工具编译环境下内嵌汇编语法格式
__asm { 指令; [指令] 指令; [指令] … [指令] }
//注释
12
ARM开发工具编译环境下实例
/* main.c */ void __main(void) { int var=0xAA; __asm { MOV R1,var CMP R1,#0xAA } while(1); }
8
2、 C程序调用汇编程序
在ARM开发工具编译环境下,要在C程序中要用
关键字extern声明要调用的汇编语言程序。 同时在
汇编程序中也要使用EXPORT伪操作声明本程序可 以被其他程序调用。
说明: EXTERN告诉编译器所使用的标号要在当前源文件 中引用,但该标号是在其他的源文件中定义的。

在ARM开发工具编译环境下设计程序,用C语言调 用ARM汇编语言实现20!的阶乘操作,并将结果 保存到0xFFFFFFF0开始的内存地址单元。
结果为一个32位的整数时,通过寄存器R0返回; 结果为一个64位整数时,通过寄存器R0,R1返回。
3
1、汇编程序调用C程序
在ARM开发工具编译环境下,汇编程序中要使用
IMPORT伪操作声明将要调用的C程序。 说明:IMPORT告诉编译器这个标号要在当前源文 件中使用,但标号是在其他的源文件中定义的。
;声明 Factorial 是一个外部函数 ;要计算的阶乘数 ; 声明代码 Fctrl ; 标识程序入口 ;将参数装入 R0 ;调用 Factorial,并通过 R0 传递参数
;文件结束
6
1、汇编程序调用C程序
程序运行结果如下:

R0 = R1 =
0x82B40000 0x21C3677C
//通过 R0,R1 返回结果
5
1、汇编程序调用C程序
首先建立汇编源文件start.s
/* start.s */ IMPORT Factorial Ni EQU 20 AREA Fctrl,CODE,READONLY ENTRY start MOV R0,#Ni BL Factorial /*注:在此处观察结果*/ Stop B Stop END
;取参数 ;高位初始化 ;初始化计数器 ;暂存高位值 ;[R9:R8]=R0*R8 ;R9=R1*R0+R9 ;计数器递减 ;计数器不为 0 继续循环 ;结果保存到 0xFFFFFFF0 开始的内存单元 ;子程序返回
10
2、 C程序调用汇编程序
每二步:建立C语言源文件main.c
/* main.c */ extern void Factorial(char Nx); //声明 Factorial 是一个外部函数 Main() { char N =20; Factorial(N); //调用汇编文件实现 N!操作 /*注:在此处观察结果*/ while(1); }
本章提要
一 ARM微处理器体系结构 二 ARM 微处理器指令集 三 C语言与汇编语言的混合编程 四 ARM处理器初始化分析
1
ARM汇编语言与嵌入式C程序相互调用
1.汇编程序调用C程序 2.
C程序调用汇编程序
2
ATPCS标准
过程调用标准ATPCS(ARM-Thumb Produce
Call Standard)规定了子程序间相互调用的基 本规则, 其中主要包括寄存器的使用规则、数 据栈的使用规则及参数的传递规则等。 子程序间通过寄存器R0~R3传递参数
7
2、 C程序调用汇编程序
在ARM开发工具编译环境下,要在C程序中要用
关键字extern声明要调用的汇编语言程序。 同时在
汇编程序中也要使用EXPORT伪操作声明本程序可 以被其他程序调用。
说明: EXTERN告诉编译器所使用的标号要在当前源文件 中引用,但该标号是在其他的源文件中定义的。
当C语言中的汇编语言较少时,可以采用在嵌 入式C语言程序中嵌入汇编语言
相关文档
最新文档