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函数,也更加清楚地了解了寄存器的原理。

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

时间: 2021-10-12

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语言内嵌汇编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语言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语言switch反汇编的实现

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

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

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

汇编语言:比较指令、跳转指令、JCC的使用

一.JMP 指令:修改EIP 当前运行的下一条指令 JMP 寄存器/立即数        目标类似:  mov  EIP,寄存器/立即数 CALL指令:  调用函数  CALL 地址A/寄存器        等价:                 PUSH 地址B           :保存call的下一条指令地址,压栈,作为返回值,                MOV EIP,地址A/寄存器            : 将函数首地址作为EIP RET指令:        等价:LEA ESP,

汇编跳转指令使用总结

虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断.80x86条件跳转指令提供了这种判断.条件跳转指令是创建循环和实现其他条件执行语句.条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置:如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令.条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000-32000条机器指令.一般情况下不会超过这种限制. 用自

详解C语言中条件判断语句if和switch的用法

if 语句 用 if 语句可以构成分支结构,它根据给的条件进行判定,以决定执行哪个分支程序段. C 语言的 if 语句有三种基本形式 第一种形式: if(条件表达式) { 语句1: } if(条件表达式) { 语句1: } 这种形式运行顺序为:当条件表达式为真,执行语句1,否则,直接跳过语句1,执行后面的语句. 例子1: BOOL result = YES: if(result) { printf("result is true\n"); } BOOL result = YES: if

16位汇编语言寄存器及指令整理(小结)

寄存器 通用寄存器 8位寄存器 16位寄存器 32位寄存器 寄存器名称 AH,AL AX EAX 累加寄存器 BH,BL BX EBX 基地址寄存器 CH,CL CX ECX 计数器寄存器 DH,DL DX EDX 数据寄存器 SI ESI 源变址寄存器 DI EDI 源目标寄存器 DH,DL DX EDX 基地址寄存器 DH,DL DX EDX 栈顶寄存器 段寄存器 标号 名称 CS 代码段 DS 数据段 SS 栈段 ES 附加数据段 GS,FS 附加数据段(+80386) 专用寄存器 标号

C#语言中条件与&&与条件或||的区别

具体不做详细介绍了,结合案例给大家做剖析,具体如下: 条件"或"运算符 (||) 执行 bool 操作数的逻辑"或"运算,但仅在必要时才计算第二个操作数. 件"与"运算符 (&&) 执行其 bool 操作数的逻辑"与"运算,但仅在必要时才计算第二个操作数 同时我们还要了解到  || 和 && 都是左结合性的逻辑运算符,所以看下面的例子 class Program { static void Ma

汇编 JCC指令表与笔记

汇编-JCC 之前可以修改EIP寄存器的指令 JMP,CALL,RETN 所有JCC指令的动作->根据标志寄存器修改EIP的值 标志寄存器 EFLAGS CF(bit 0)[Carry flag] C位 若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零 这个标志通常用来指示无符号证书运算的溢出状态 宽度溢出位.只要容器内放不下就会发生变化 MOV AL,0xFE ADD AL,2 C => 1 MOV AL,0x7F SBU AL,0

Nginx根据不同浏览器语言配置页面跳转的方法

当我们打开很多网站时,可能大家会发现,它会根据你使用的语言自动判断并跳转到不同的语言界面.例如:Google 也就是你用不同的语言,那么输入Google首页就可以自动转向你使用的语言.在这个网络普及的时代,外贸的主要途径一定是网络.也许你的企业网站既有中文版本,同时也有英文版本(如果你的公司有外贸业务).那么他们的网站是怎样实现这个功能呢?下面我们来研究下Web服务器的Header,HTTP_ACCEPT_LANGUAGE是服务器所接收的语言,一般来说是服务器的语言.在网站可以看到,firefo

iOS逆向工程之Hopper中的ARM指令详解

虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的.虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢.ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些.当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自

什么是汇编语言

汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植. 许多汇编程序为程序开发.汇编控制.辅助调试提供了额外的支持机制.有