arm汇编(c内嵌汇编及c和汇编互调)
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和汇编互调)的更多相关文章
- GCC嵌入式汇编(内嵌汇编)入门
GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...
- ARM GCC 内嵌(inline)汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 百度云:http://pan. ...
- ARM GCC 内嵌汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...
- GCC 内联汇编(GCC内嵌ARM汇编规则)
转:http://smileleeboo.howbbs.com/posts/list/3127/81062.html 更多文档参见:http://pan.baidu.com/s/1eQ7nd8Q 有时 ...
- 转: __asm__ __volatile__内嵌汇编用法简述
from: http://www.embedu.org/Column/Column28.htm __asm__ __volatile__内嵌汇编用法简述 作者:刘老师,华清远见嵌入式学院高级讲师,AR ...
- 【原创】X86_64汇编、寄存器、内嵌汇编
整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- C内嵌汇编-格式
C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ...
- Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
随机推荐
- WIN8 WIN10系统如何完全获取用户管理员权限
按住WIN+R 2 计算机配置----Windows设置----安全设置----本地策略----安全选项----用户账户控制:以管理员批准模式运行所有管理员,把启用改为禁止然后重启电脑
- PHP的curl常用的5种写法
// 1,抓取无访问控制文件 $ch= curl_init(); curl_setopt($ch, CURLOPT_URL,"http://localhost/mytest/phpinfo. ...
- MySQL 查询结果保存为CSV文件
MySQL支持将查询结果直接导出为文本格式,格式如下: into outfile '导出的目录和文件名' 指定导出的目录和文件名 fields terminated ...
- flask开发restful api系列(3)--利用alembic进行数据库更改
上面两章,主要讲基本的配置,今天我们来做一个比较有趣的东西,为每个客户加一个头像图片.如果我们图片保存在自己的服务器,对于服务器要求有点高,每次下载的时候,都会阻塞网络接口,要是1000个人同时访问这 ...
- LeetCode_Rotate List
Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given ...
- QDialog 模态对话框与事件循环(exec其实就是调用了show和eventLoop.exec)
起源 qtcn中文论坛中有网友问到: 假设程序正常运行时,只有一个简单的窗体A,此时只有一个GUI主线程,在这个主线程中有一个事件循环处理窗体上的事件.当此程序运行到某阶段时,弹出一个模态窗体B(书上 ...
- Visual Studio中的lib的链接顺序
描述:如果有一个exe工程,它依赖于A.lib,B.lib,A.lib和B.DLL我同样有他们的源码工程.依赖顺序是这样的exe->A.lib->B.DLL.那么如果我改动了B的源码,编译 ...
- hdu1824-Let's go home:图论2-SAT
关键在于找出一定矛盾的条件,设一队的3个人为(a,b,c),a为队长,那么(a不留下,b不留下)矛盾,(a不留下,c不留下)矛盾; 对于每一对队员,(a留下,b留下)矛盾. 把模型建好,剩下的就是套模 ...
- Java Spring各种依赖注入注解的区别
Spring对于Bean的依赖注入,支持多种注解方式: @Resource javax.annotation JSR250 (Common Annotations for Java) @Inject ...
- Mac OS X 下修改网卡地址和抵御 ARP 攻击
用 Mac 系统有一段时间了,这里记录一下自己遇到的需要终端命令解决的问题. 网络环境绑定了原先机器的 MAC 地址,由于特殊原因,先把新机器的网卡地址改成原先那台. 在终端输入sudo ifconf ...