C语言中调用汇编语言详解

目录
  • 1.建立新工程
  • 2.改写程序
  • 3.总结

1.建立新工程

首先点击Project里面的 New uVision Project

然后输入文件名,点击保存即可。

在你命名的project中创造一个汇编程序与c程序

c程序

#include<stdio.h>
extern void Init_1(void);
int main()
{
    Init_1();
    return 0;
}

汇编程序

     AREA    My_Function,CODE,READONLY
    EXPORT Init_1
Init_1
    MOV R1,#0
    MOV R2,#0
LOOP
    CMP R1,#10
    BHS LOOP_END
    ADD R2,#1
    ADD R1,#1
    B LOOP
LOOP_END
    NOP
    END

然后进行设置,点击Debug,勾选Use Simulator,将dialog dll下改为DARMSTM.dll ,将parameter下改为-pSTM32F103ve

注意:parameter中的调试型号要与最初选择的芯片一致

2.改写程序

c语言

#include<stdio.h>
extern int Init_1();
int Init_1()
{
    int x=5;
    return x+100;
}

汇编语言

 IMPORT Init_1
    AREA MYCODE, CODE
    EXPORT __main
__main
    BL Init_1
    END
 

解释:这里的IMPORT Init_1 表示汇编程序里面进口或引入C里面的函数Init_1。

结果

3.总结

通过这次实验,我熟悉了keil5下汇编语言和C语言的混用,既能在C语言里面调用汇编程序,也能在汇编程序里面调用C函数,也更加清楚地了解了寄存器的原理。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • c语言switch反汇编的实现

    目录 一.switch语句 1.在正向编码时,switch语句可以看做是if语句的简写 2.break在switch语句的妙用 二.switch语句的反汇编 1.当switch存在3个分支时 2.当switch语句出现四个分支时,编译器会产生大表 3.当switch存在多个分支,常量连续性相对不高时 补充:当case后的常量差距较大时 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因 一.switch语句 1.在正向编码时,switch语句可以看做是if语句的简写

  • c语言调用汇编的方法

    c部分很简单,文件名随便,如main.c: 复制代码 代码如下: #include <stdio.h>#include <stdlib.h> void decToBin(long dec,char *b); //声明外部汇编函数int main(){          long dec=254;          char *bin=(char*)malloc(sizeof(char)*64);          decToBin(dec,bin);          printf

  • C语言中的数组和指针汇编代码分析实例

    今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 复制代码 代码如下: #include "stdafx.h" int main(int argc, char* argv[]) {        char a=1;        char c[] = "

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

  • 汇编语言 跳转指令与C语言的条件分支

    跳转指令 跳转指令也是一个组的指令,称为j组.其中jmp为无条件跳转,其余为条件跳转 上图为j组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如上图,通过反汇编软件得到机器指令与汇编语言,其中左边为机器指令编码,右边为对应汇编语言含义,最左边为每条机器指令地址 jmp指令的对应机器指令有两个字节:eb表示这是jmp指令,03描述跳转信息.值得注意的是,跳转指令进行编码时,采用相对位置编码,如03描述的就是偏移量 结合实例进行理解:在未执行jmp指令时,rip寄存器存

  • C语言内嵌汇编API内存搜索引擎实例

    本文实例讲述了C语言内嵌汇编API内存搜索引擎的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: // apisearchEngine.cpp : Defines the entry point for the console application.  //    #include "stdafx.h"  #include <Windows.h>     DWORD __stdcall GetStrLengthA(char* szName)  {   

  • C语言中调用汇编语言详解

    目录 1.建立新工程 2.改写程序 3.总结 1.建立新工程 首先点击Project里面的 New uVision Project 然后输入文件名,点击保存即可. 在你命名的project中创造一个汇编程序与c程序 c程序 #include<stdio.h> extern void Init_1(void); int main() { Init_1(); return 0; } 汇编程序 AREA My_Function,CODE,READONLY EXPORT Init_1 Init_1 M

  • C语言中冒泡排序算法详解

    目录 一.算法描述 二.算法分析 三.完整代码 总结 一.算法描述 比较相邻两个元素,如果第一个比第二个大则交换两个值.遍历所有的元素,每一次都会将未排序序列中最大的元素放在后面.假设数组有 n 个元素,那么需要遍历 n - 1 次,因为剩下的一个元素一定是最小的,无需再遍历一次.因此需要两层循环,第一层是遍历次数,第二层是遍历未排序数组. 动图如下: 黄色部分表示已排好序的数组,蓝色部分表示未排序数组 核心代码如下: /** * @brief 冒泡排序 * * @param arr 待排序的数

  • C语言中自定义类型详解

    目录 结构大小 offsetof 结构体对齐规则 存在原因 总结 结构大小 我们先随便给出一个结构体,为了计算他的大小,我给出完整的打印方案: typedef struct num { char c; int n; char cc; }num; int main() { printf("%d\n", sizeof(num)); return 0; } 好了,按道理来说我计算一个结构体大小就看他的各个成员需要消耗多大的空间, num 结构体中三个成员分别是 char ,int ,char

  • Android入门之在子线程中调用Handler详解

    目录 简介 本章示例 前端代码 后端代码 简介 前一章我们以一个简单的小动画来解释了Handler. 这章我们会介绍在子线程里写Handler.如果是Handler写在了子线程中的话,我们就需要自己创建一个Looper对象了:创建的流程如下: 直接调用Looper.prepare()方法即可为当前线程创建Looper对象,而它的构造器会创建配套的MessageQueue; 创建Handler对象,重写handleMessage( )方法就可以处理来自于其他线程的信息了! 调用Looper.loo

  • Go语言中你不知道的Interface详解

    前言 最近在看Go语言的面向对象的知识点时,发现它的面向对象能力全靠 interface 撑着,而且它的 interface 还与我们以前知道的 interface 完全不同.故而整个过程不断的思考为什么要如此设计?这样设计给我们带来了什么影响? interface 我不懂你 Rob Pike 曾说: 如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口 被Go语言设计者如此看重,想来 interface 一定是资质不凡,颜值爆表.但是说实话,当我第一次读这部分内容的时候,我产生了以下

  • Go语言中的函数详解

    1.函数的声明定义 //func关键字 //getStudent函数名 //(id int, classId int) 参数列表 //(name string,age int) 返回值列表 func getStudent(id int, classId int)(name string,age int) { //函数体 if id==1&&classId==1{ name = "BigOrange" age = 26 } //返回值 return name, age /

  • C语言中的常量详解

    目录 C语言中的常量 字面常量 #define定义的标识符常量 枚举常量 C语言中的常量 C编程中的常量是一些固定的值,它在整个程序运行过程中无法被改变. 字面常量 字面常量是直接写出的固定值,它包含C语言中可用的数据类型,可分为整型常量,字符常量等.如:9.9,"hello"等就属于这一类常量. ##const修饰的常变量 有的时候我们希望定义这么一种变量:值不能被修改,在整个作用域中都维持原值.为了满足用户需求,C语言标准提供了const关键字.在定义变量的同时,在变量名之前加上c

  • Go语言中的闭包详解

    一.函数的变量作用域和可见性 1.全局变量在main函数执行之前初始化,全局可见 2.局部变量在函数内部或者if.for等语句块有效,使用之后外部不可见 3.全局变量和局部变量同名的情况下,局部变量生效. 4.可见性: 包内任何变量或函数都是能访问的. 包外的话,首字母大写是可以访问的,首字母小写的表示私有的不能被外部调用. 二.匿名函数 1.Go语言中函数也是一种类型,所以可以用一个函数类型的变量进行接收. func anonyTest1(){ fmt.Println("anonyTest1&

  • Kotlin 语言中调用 JavaScript 方法实例详解

    Kotlin 语言中调用 JavaScript 方法实例详解 Kotlin 已被设计为能够与 Java 平台轻松互操作.它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类.但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型.你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotlin 类型系统的全部威力 ,你可以为 JavaScript 库创建 Kotlin 头文件. 内联 J

  • C语言中调用Swift函数实例详解

    C语言中调用Swift函数实例详解 在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与

随机推荐