C语言编译成汇编:

arm-linux-gcc -S test.c -o test.S

C语言编译成可执行文件:

arm-linux-gcc test.c -o test

多个文件编译链接:

arm-linux-gcc –c main.c –o main.o

arm-linux-gcc –c abc.S –o abc.o

arm-linux-gcc main.o abc.o –o test.o

汇编编译两种方式:

arm-linux-as test.S -o test.o

arm-linux-gcc –c test.S –o test.o

ARM裸机程序编译:

arm-linux-gcc -c start.S -o start.o

arm-linux-ld -Ttext=0x40000000 start.o -o start.elf

arm-linux-objcopy -I elf32-littlearm -O binary start.elf –o start.bin

查看代码地址信息:

arm-linux-objdump -h test

ARM反汇编:

arm-linux-objdump -D elf_file > dis_file

一、arm内嵌汇编

#include <stdio.h>

int main(void){

int a = 88;

__asm__ __volatile__(

"mov r0, %1\n"

"mov r1, #1\n"

"add %0, r0, r1\n"

: "=r" (a)

:"r" (a)

: "r0", "r1"

);

printf("a = %d\n",a);

return 0;

}

有些知识:

a) __asm__(下划线每次两根):表示嵌入汇编。__volatitle__:表示编译不优化。

b) c语言中我们是这样定义字符串的char *str = “Hello, world”;但同时我也可以这样定义:char *str = “Hello,” “world”;,这样同样是表示一个字符串。内嵌汇编中通过\n来分开每条指令,如:”mov r0,r1\nmov r1,r2”。显然这样连着不方便阅读,我想要一条指令一行,这样好些,有两种写法:

1)”mov r0,r1\n  \

mov r1,r2”

就是用\作为连字符

2)”mov r0,r1\n”

“mov r1,r2”

就是和上面说的c中定义字符串的第二种形式。

冒号后面相关含义:

: "=r" (a):内嵌汇编输出部分(通过=r来判断为输出)

:"r" (a):内嵌汇编输入部分(通过r来判断输入)

: "r0", "r1":需要保护的寄存器(破坏部分)

用占位符来引用输入输出变量,按位置从%0、%1以此类推,如:这里输入部分a在前面即它为%0,输出a即为%1。

再比如::”=r” (a),”=r”b

:”r” (a)

则顺序为%0、%1、%2

除了用%n之外还可以用标号:

:[a] “=r” (a)

:[b] “r” (b)

使用:mov %[b],%[a]

二、汇编调用C函数

汇编文件main.S

.section .text

.global main

main:

mov ip, sp

stmfd sp!, {fp, ip, lr, pc}

sub fp, ip, #4

bl abc

ldr r0, =str

mov r1, #'a'

strb r1, [r0]

bl printf

sub sp,fp ,#12

ldmfd sp, {fp, sp, pc}

.section .data

str:

.asciz "hello world.\n"

str1:

.ascii "hello world.\n0"

.comm l1, 10000

l2: .space 1000

C文件abc.c

void abc(void)

{

printf("hello, c file\n");

}

三、C调用汇编函数

C文件main.c

#include <stdio.h>

extern void abc(void);

void main(void)

{

printf("start call asm fun\n");

abc();

printf("end call asm fun\n");

}

汇编文件abc.S

.global abc

abc:

mov ip, sp

stmfd sp!, {fp, ip, lr, pc}

sub fp, ip, #4

adr r0, str

bl printf

b next

str:

.asciz "hello, s file\n"

.align 2

next:

sub sp,fp ,#12

ldmfd sp, {fp, sp, pc}

其中,这个C和汇编的互调还是不太理解,先做个笔记先。

arm汇编(c内嵌汇编及c和汇编互调)的更多相关文章

  1. GCC嵌入式汇编(内嵌汇编)入门

    GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...

  2. ARM GCC 内嵌(inline)汇编手册

    转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 百度云:http://pan. ...

  3. ARM GCC 内嵌汇编手册

    转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...

  4. GCC 内联汇编(GCC内嵌ARM汇编规则)

    转:http://smileleeboo.howbbs.com/posts/list/3127/81062.html 更多文档参见:http://pan.baidu.com/s/1eQ7nd8Q 有时 ...

  5. 转: __asm__ __volatile__内嵌汇编用法简述

    from: http://www.embedu.org/Column/Column28.htm __asm__ __volatile__内嵌汇编用法简述 作者:刘老师,华清远见嵌入式学院高级讲师,AR ...

  6. 【原创】X86_64汇编、寄存器、内嵌汇编

    整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...

  7. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

  8. C内嵌汇编-格式

    C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ...

  9. Linux内核--C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

随机推荐

  1. mysql在linux的安装

  2. CSS/CSS3长度、时间、频率、角度单位大全

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1494 一.一笔带过的 ...

  3. vim 折叠代码技巧汇总

    以下命令输入的方式: 如zo命令,先按z键,松开后按o键即可展开折叠. 一.打开.关闭折叠 zo 展开折叠,只展开最外层的折叠. zO 对所在范围内所有嵌套的折叠点展开,包括嵌套折叠. zc 折叠,只 ...

  4. $rootScope

    参考地址 https://docs.angularjs.org/api/ng/type/$rootScope.Scope angular 的scope一般上都是有继承关系的,也就是说可以通过原型访问到 ...

  5. Light OJ 1314 Names for Babies

    http://www.lightoj.com/volume_showproblem.php?problem=1314 题意:给定一个串和p,q,求长度在p到q之间的子串有几种 思路:后缀数组,对于每个 ...

  6. void (*fun)(void);

    2440test程序中的Main.c中在结构体中有这么一句: void (*fun)(void); 后查阅资料得知这句代码的意思是: 定义一个函数指针. 比如:定义一个指向函数的指针,该函数有一个整形 ...

  7. 自制单片机之十五……可串行驱动LCD12864的应用

    在网上搜了一下,ST7920控制器的LCD产品可以提供8位,4位并行和串行接口可选,并行的控制接口的LCD较多,前面的贴子也介绍过,我们在这儿不说了,这儿我们讲的是串口控制LCD12864. 买了块S ...

  8. 用keil怎么像makefile那样选择哪些文件进行编译?

    因为设备有多种不同的型号的硬件,所以就有不同的驱动,我想在编译的时候,像在linux下的makeile那样,自己写一个编译连接的东西,来控制我哪些文件进行编译链接,不知道在keil下有没有这样的方法. ...

  9. Google GFS文件系统深入分析

    Google GFS文件系统深入分析 现在云计算渐成潮流,对大规模数据应用.可伸缩.高容错的分布式文件系统的需求日渐增长.Google根据自身的经验打造的这套针对大量廉价客户机的Google GFS文 ...

  10. 深入浅出Node.js (8) - 构建Web应用

    8.1 基础功能 8.1.1 请求方法 8.1.2 路径解析 8.1.3 查询字符串 8.1.4 Cookie 8.1.5 Session 8.1.6 缓存 8.1.7 Basic认证 8.2 数据上 ...