[国嵌攻略][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示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void write_p15_c1(unsigned long value){
    __asm__(
    “mcr p15, 0, %0, c1, c0\n”
    :
    :”r”(value)   @编译器任意选择一个rx寄存器
    :
);
}
 
unsigned long read_p15_c1(){
    unsigned long value;
    __asm__(
    “mrc p15, 0, %0, c1, c0,0\n”
    :”=r”(value)   @’=’表示只写操作数,用于输出
:
:”memory”   @表示修改内存,value局部变量保存在内存的栈中
);
    return value;
}
 
unsigned long old;
unsigned long temp;
 
__asm__ volatile(   @volatile告诉编译器,不要对优化下面的代码
    “mrs %0, cpsr \n”
    “orr %1, %0, #128 \n”
    “msr cpsr_c, temp \n”
    :”=r”(old),”=r”(temp)
    :
    :
);
 
void init_led(){
        __asm__(
                "ldr r0, =0x56000010 \n"
                "ldr r1, =0x00015400 \n"
                "str r1, [r0] \n"
 
                "ldr r0, =0x56000014 \n"
                "ldr r1, =0x00000140 \n"
                "str r1, [r0] \n"
                :
                :
                :"r0", "r1"
        );
}

 

posted @   盛夏夜  阅读(308)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示