C语言和ARM汇编混合编程实现阶乘运算

发布者:Coboro最新更新时间:2016-08-07 来源: eefocus关键字:C语言  ARM汇编  混合编程  阶乘运算 手机看文章 扫描二维码
随时随地手机看文章
1.阶乘运算必须用汇编语言实现;

2. 通过C语言调用阶乘运算结果并显示出来。

(1)    用汇编语言编写阶乘运算子程序,命名为zmc.s;

程序如下:

AREA asmfile,CODE,READONLY

  EXPORT asmDouble

asmDouble

     sub R1,R0,#1

     cmp R1,#00

     BEQ L2

L1  mul R2,R0,R1

    sub R1,R1,#1

    mov R0,R2

    cmp R1,#00

    BNE L1

L2  mov pc, lr

END

(2)    将其添加到半主机程序中的SYS中;

(3)    将半主机程序的main修改如下:

#include "def.h"

#include "44b.h"

#include "stdio.h"

#include "sys_lcd.h"

extern int asmDouble(int a);

void Delay(int time)

{

       volatile int i,j;

      

       i = 0;

       j = 0;

      

       for(i = 0; i

       {

              j = 0;

          while(j++<30)

                  ;

       }

}

 

 

struct __FILE

{

       int handle;

};

 

FILE __stdout, __stdin;

 

void UART_Init(int baud)

{

    rUFCON0=0x0;     // FIFO disable

    rUFCON1=0x0;

    rUMCON0=0x0;

    rUMCON1=0x0;

   

    rULCON0=0x3;       // UART0

    rUCON0=0x245;

    rUBRDIV0=( (int)(MCLK/16./baud + 0.5) -1 );

  

    rULCON1=0x3;       // UART1

    rUCON1=0x245;

    rUBRDIV1=( (int)(MCLK/16./baud + 0.5) -1 );

 

       Delay(10);

}

 

#define SemiSWI 0x123456

 

__swi(SemiSWI) void _WriteC(unsigned op, char *c);

#define WriteC(c) _WriteC(0x3,c)

 

__swi(SemiSWI) unsigned char _ReadC(unsigned op, char val);

#define ReadC() _ReadC(0x7,0)

 

__swi(SemiSWI) void _Exit(unsigned op, unsigned except);

#define Exit() _Exit(0x18,0x20026)

 

void UART_PutChar(unsigned char data)

{    

       rUTXH0=data;

 

       while(!(rUTRSTAT0 & 0x2))

              ;

}    

      

char UART_GetChar(void)

{

       while(!(rUTRSTAT0 & 0x1))

              ;

 

       return rURXH0;

}

 

extern void LCD_PutChar(unsigned char data);

 

int fputc(int ch, FILE *f)

{    

       char tempch = ch;

      

           WriteC( &tempch );

 

       return ch;

}

 

int fgetc(FILE *f)

{

    unsigned char tempch;

       

   

    tempch = ReadC();

      

      

    return tempch;

}

 

int ferror(FILE *f)

{

       return EOF;

}

 

void _sys_exit(int return_code)

{

    Exit();         /* for debugging */

 

label:  goto label; /* endless loop */

}

 

int main(void)

{

       int a;

       int b;

 

 

       Port_Init();

      

       IO82C55A_Init();

      

       UART_Init(115200);

 

       LCD_Init();

      

       LCD_ChangeMode(DspTxtMode);

      

       LCD_Printf("Hello World!\n");

      

while(1)

{

              printf("Hello! Please Input N: \n\n"); 

 LCD_Printf("Hello! Please Input N: \n\n");   

       scanf("%d",&a);

      

                            b=asmDouble(a);

              printf("%d!=%d\n",a,b);

 LCD_Printf("%d!=%d\n",a,b);   

              }

              }

(4)    调试观察结果:

显示:Hello! Please Input N:

      输入5

显示5!=120;

输入3!=6;

结果正确。

关键字:C语言  ARM汇编  混合编程  阶乘运算 引用地址:C语言和ARM汇编混合编程实现阶乘运算

上一篇:ARM中ADS环境下C语言和汇编语言混合编程及示例
下一篇:ARM核的Bootloader代码

推荐阅读最新更新时间:2024-03-16 15:04

PIC16F887配置字(C语言
PIC16F887的配置字有两个,第一个配置字CONFIG1地址为2007H,第二个配置字CONFIG2地址为2008H。 使用PICC编译器时,配置方法有两种:(详情可以看PICC编译器中的user manual) 第一种是:(编译器MPLAB IDE,configuration bits set in code 不要勾选,若勾选,编译程序时,会忽略掉程序中的__CONFIG,导致__CONFIG无 效) #include htc.h __CONFIG(data1);//config1 2007h __CONFIG(data2);//config2 2008h 第二种是: 使用编译器 MPLAB ID
[单片机]
PIC16F887配置字(<font color='red'>C语言</font>)
ARM汇编----IMPORT
IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。 语法格式: IMPORT symbol{ } 其中,symbol为声明的符号的名称。它是区分大小写的。 指定这个选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。 使用说明: 使用IMPORT伪操作声明一个符号是在其他源文件中的定义。如果连接器在连接处理时不能解析该符号,而IMPORT伪操作中没有指定 选项,则连接器将会报告错误。如果连
[单片机]
Proteus仿真51单片机C语言程序-单片机间双向通信
简介:单片机之间的双向通信:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。
[单片机]
Proteus仿真51单片机<font color='red'>C语言</font>程序-单片机间双向通信
LabVIEW还是C语言
为什么LabVIEW优于C语言? 作为LabVIEW产品经理,我被很多次问到这个问题。 老实说,这么提问实际上是错误的。必须要有具体的应用环境,这么提问才有意义(例如, 在这些限制条件下,哪一种语言更适合这个任务? ) 若没有这些细节,这个问题就像为什么面包比面粉好一般无意义。 如果您想创建一个测控系统,不同于C语言等低级语言,使用NI LabVIEW系统设计软件能够帮助您降低风险、节省开支并免除不必要的麻烦。在这里我并非暗示LabVIEW是比C语言 更好 的编程语言 特别是考虑到LabVIEW大部分内容不仅仅由G语言编写,还由C和C++语言组成。 恰恰相反,这两种语言各自具有不同的优势,程序员应合理择取才能达到自己的目的。
[测试测量]
LabVIEW还是<font color='red'>C语言</font>?
51单片机——IIC、EEPROM数据存储 C语言入门编程
IIC: I2C(Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单, 器件封装形式小,通信速率较高等优点。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。由于其管脚少,硬件实现简单,可扩展性强等特点,因此被广泛的使用在各大集成芯片内。 (1)它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在 一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通 讯从机。 (2)一个I2C总线只使用两条总线
[单片机]
51单片机——IIC、EEPROM数据存储 <font color='red'>C语言</font>入门编程
数码管显示模拟8位时钟C语言程序设计
//数码时钟设计 #include reg52.h // 包含51单片机寄存器定义的头文件 unsigned char Tab ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //control shape unsigned char port ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char int_time ; //中断次数计数变量 unsigned char second; //秒计数变量 unsigned char minute; //分钟计数变量 unsigned char hour;
[单片机]
Altera为Nois II处理器提供C语言硬件加速工具
Altera公司今天宣布为Nios II系统开发人员提供新的效能工具Nios® II C语言至硬件加速(C2H)编译器,该工具能够有效的提高嵌入式软件的性能。由于越来越多的嵌入式设计使用了FPGA,因此,Nios II C2H编译器的目的是帮助嵌入式系统开发人员提高效率,实现成功的设计。作为Nios II C2H编译器的一部分,Altera还允许第三方工具供应商使用其系统级基本结构,包括Quartus® II SOPC Builder工具,以促进多种电子系统级(ESL)设计工具的开发。 Nios II C2H编译器利用Altera系统级基本结构来切实提高多种实际应用的性能。这一新工具能够将对性能要求较高的C语言例程自动转换为硬件加
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved