• [国嵌攻略][045-046][一跃进入C大门]


    [一跃进入C大门]

    跳转方式

    1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转

    2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转

    代码编写

    1.在汇编代码中直接使用绝对跳转,跳转到C代码中,然后在C代码中通过点亮LED来验证

    2.210在跳转到C程序时,需要注意复制代码时,要跳过校验信息。要不然跳转到内存时,前16个字节为头信息,整个起始地址向后偏移了16个字节,就找不到正确地址了

    [C与汇编混合编程]

    为什么需要C与汇编混合编程

    1.汇编语言:执行效率高,编写繁琐

    2.C语言:可读性强,移植性好,调试方便

    3.混合编程可以提高执行效率,能够直接控制处理器,结合两者的优点

    混合编程类型

    1.汇编调用C函数

    直接在汇编中调用C函数名(函数名相当于标号地址)

    2.C调用汇编函数

    在C中把汇编标号当函数调用(汇编标号需要通过global声明成全局)

    3.C内嵌汇编代码

    3.1格式:

    __asm__(

        汇编语句

        :输出

        :输入

        :破坏描述

    );

    输出表示输出到C的变量,输入表示从C中输入的变量,破坏描述表示内嵌汇编中修改的寄存器。

    C内嵌汇编以关键字”__asm__”或”asm”开始,下面四个部分,各部分之间使用”:”隔开,第一部分必须写,后面三个部分可以省略,但”:”不能省略

    3.2示例:

    void write_p15_c1(unsigned long value){
    	__asm__(
    	“mcr p15, 0, %0, c1, c0
    ”
    	:
    	:”r”(value)   @编译器任意选择一个rx寄存器
    	:
    );
    }
    
    unsigned long read_p15_c1(){
    	unsigned long value;
    	__asm__(
    	“mrc p15, 0, %0, c1, c0,0
    ”
    	:”=r”(value)   @’=’表示只写操作数,用于输出
    :
    :”memory”   @表示修改内存,value局部变量保存在内存的栈中
    );
    	return value;
    }
    
    unsigned long old;
    unsigned long temp;
    
    __asm__ volatile(   @volatile告诉编译器,不要对优化下面的代码
    	“mrs %0, cpsr 
    ”
    	“orr %1, %0, #128 
    ”
    	“msr cpsr_c, temp 
    ”
    	:”=r”(old),”=r”(temp)
    	:
    	:
    );
    
    void init_led(){
            __asm__(
                    "ldr r0, =0x56000010 
    "
                    "ldr r1, =0x00015400 
    "
                    "str r1, [r0] 
    "
    
                    "ldr r0, =0x56000014 
    "
                    "ldr r1, =0x00000140 
    "
                    "str r1, [r0] 
    "
                    :
                    :
                    :"r0", "r1"
            );
    }
    
  • 相关阅读:
    循环语句
    JAVA-数据类型、变量、常量
    JAVA——程序流程控制——循环语句——for循环(打印三角形)
    循环语句
    JAVA基础学习1
    新手上路
    mysql内置函数之事务
    mysql内置功能
    mysql内置函数之视图
    pymysql模块
  • 原文地址:https://www.cnblogs.com/d442130165/p/4931491.html
Copyright © 2020-2023  润新知