实验二  C语言与汇编语言混合编程
一、 实验目的
1.掌握ARM嵌入式C语言编程基本方法。
2.  掌握嵌入式汇编(Inline Assembly)编程规则和方法。
3.掌握汇编语言程序和C语言程序之间相互调用规则和编程方法。
二、实验步骤
1.  创建工作空间并且添加工程。
2.编写程序并且利用软件仿真查看结果。
三、实验内容
1. 利用汇编语言编写初始化程序,实现管理模式下堆栈指针初始化,并最终跳转到C语言程序开始c语言中文网汇编语言Main函数处执行。
2. 利用汇编语言编写子程序实现字符串拷贝功能,利用C语言在Main函数中定义字符串“Hello World!”定义并调用该子程序完成字符串拷贝。
3. 利用汇编语言编写子程序完成冒泡法排序,利用C语言在Main函数中定义字符串“Hello World!”定义并调用该子程序将数组中字符按照ASCII码值由小到大重新排序。
思考:
1. GNU编译环境下混合编程与ADS环境下有些什么区别?
.global _start
.global str_cpy
.text
_start:
        BIC    R0,R0,#MODEMASK @CPSR中的模式位
        ORR    R1,R0,#FIQMODE  @设置模式位为FIQ模式
        MSR    CPSR_c, R1        @切换处理器到FIQ模式
        LDR    SP,=FIQStack    @设置该模式下的堆栈
       
        BIC    R0,R0,#MODEMASK @CPSR中的模式位
                                                     
        ORR    R1,R0,#IRQMODE  @设置模式位为IRQ
        MSR    CPSR_c, R1        @切换处理器到IRQ模式
        LDR    SP,=IRQStack    @设置该模式下的堆栈
       
        BIC    R0,R0,#MODEMASK @CPSR中的模式位
                                                     
        ORR    R1,R0,#USRMODE  @设置模式位为IRQ
      MSR    CPSR_c, R1        @切换处理器到IRQ模式
        LDR    SP,=IRQStack    @设置该模式下的堆栈
       
        BL    Main
        B    .
       
.equ FIQMODE,0x11
.equ IRQMODE,0x12
.equ SVCMODE,0x13
.equ USRMODE,0x10
.equ SVCStack,0x03FE0100
.equ FIQStack,0x03FE0200
.equ IRQStack,0x03FE0300
.equ MODEMASK,0x1F
str_cpy:
        LDRB    R2,[R0],#1
        STRB    R2,[R1],#1
        CMP    R2,#0
        BNE      str_cpy
        MOV    PC,R14       
.end
extern void str_cpy(char *x,char *y);
int Main()
{
    char *a="Hello World!\n";
    char b[13];
    str_cpy(a,b);
    return 0;
}
.global _start
.global str_cpy
.global line
.text
_start:
        BIC    R0,R0,#MODEMASK @CPSR中的模式位
        ORR    R1,R0,#FIQMODE  @设置模式位为FIQ模式
        MSR    CPSR_c, R1        @切换处理器到FIQ模式
        LDR    SP,=FIQStack    @设置该模式下的堆栈
       
        BIC    R0,R0,#MODEMASK @CPSR中的模式位
                                                     
        ORR    R1,R0,#IRQMODE  @设置模式位为IRQ
        MSR    CPSR_c, R1        @切换处理器到IRQ模式
        LDR    SP,=IRQStack    @设置该模式下的堆栈

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。