Jetson TK下如何写汇编语言
首先,可以根据http://www.cnblogs.com/zenny-chen/p/3816620.html来安装CUDA工具链。这个工具集里包含了CUDA编译器以及其它必要的工具。然后,我们进入/usr/local/cuda-6.0/samples/0_Simple 目录下找到最简单的vectorAdd文件夹,把它复制到你Home目录下的某个子目录下。然后,我们在命令行(terminal)使用cd命令进入此目录。注意,Ubuntu下可以直接把文件夹或文件拖进命令行,这样就把该文件夹或文件的绝对路径复制到命令行里了。
由于,我们使用Jetson的时候,往往会用CUDA,所以会跟CUDA一起编译连接。而CUDA的源文件(.cu)最终会被翻译为C++源文件(.cpp),而CUDA源文件里又不能使用连接存储指定符(Link Storage Specifier,比如extern "C"),因此,如果我们要使用汇编源文件的外部函数,必须得另写一个.cpp文件——C++源文件是可以通过extern "C"来找到C语言或汇编语言的外部符号的,在C++源文件里使用汇编源文件的外部函数。
因此,我们第一步是要在vectorAdd里新增两个文件,一个叫testASM.s(汇编源文件),一个叫hello.cpp(C++源文件)。
然后,我们编辑testASM.s:
.text
.align .globl MyASMTest .thumb MyASMTest: add r0, r0, r1
vadd.i32 q0, q0, q0
bx lr
注意上述第6行,.thumb指示符,由于NVCC编译器默认使用Thumb-2指令集来编译所有源文件,而此工具链比较矬,不支持-mthumb-interwork编译选项,因此无法混编ARM与Thumb代码。因此,我们要么在汇编源文件里写.thumb,如果用.arm的话,那么得修改编译选项(后面会讲),把编译选项默认设置为ARM即可。
然后,我们看看hello.cpp的内容:
#include <stdio.h> extern "C" int MyASMTest(int, int); void HelloTest(void)
{
printf("The vaue is: %d\n", MyASMTest(, ));
}
最后,我们在默认的vectorAdd.cu源文件里,找到main函数最后的return 0;语句,在上面插入以下代码:
extern void HelloTest(void); HelloTest();
这样,所有源文件都编辑好了。下面,我们需要修改makefile文件来把新增的源文件都参加编译与连接。
对于此MakeFile,我们从上到下来看:
首先,我们找到EXTRA_CCFLAGS这个符号,这里可以定义额外的编译选项。如果我们要把源文件都默认编译为ARM指令集,那么可以将其修改为:
EXTRA_CCFLAGS ?= -marm
由于我们在汇编文件里动用了NEON指令集,因此我们需要增加-mfpu=neon命令,因此,我们可以这么加:
如果之前已经动用了?=,那么我们再添加使用+=。EXTRA_CCFLAGS ?= -mfpu=neon
然后,我们找到build: vectorAdd
我们复制vectorAdd.o:vectorAdd.cu以及下面的编译选项语句,然后粘贴到下一行(中间最好空一行,更容易查看),将vectorAdd.o改为testASM.o,把vectorAdd.cu改为testASM.s,然后编译选项不用动。
然后再粘贴一行,同样,把vectorAdd.o改为hello.o;把vectorAdd.cu改为hello.cpp。
OK,这样就把需要编辑的源文件都添加好了。后面再添加连接目标文件。在下一行,我们发现vectorAdd: vectorAdd.o后面再把testASM.o与hello.o添加上即可——vectorAdd: vectorAdd.o testASM.o hello.o
最后,我们在clean:里把需要清除的.o都加上,即上述的testASM.o hello.o。这样,我们就可以通过make clean很快把生成的目标文件都删除了。
这里顺带说一下,我们找到GCC这个符号,会看到默认采用g++。这样不管什么.c还是.cpp都会默认使用G++编译器来编译,即最后是C++文件。如果我们想编译为.c源文件(再加上支持C11标准),我们可以直接改用gcc。比如,我们再增加一个源文件,名字为pureC.c,内容如下:
int MySum(void)
{
int buffer[] = { [] = , [] = -, [] = , [] = - };
int sum = ;
for(int i = ; i < sizeof(buffer) / sizeof(buffer[]); i++)
sum += buffer[i]; return sum;
}
我们可以在hello.cpp中调用此函数。增加此源文件时,需要修改一下MakeFile,首先,我们在ALL_CCFLAGS符号定义下,ALL_LDFLAGS符号定义的上面插入以下makefile命令:
MY_CFLAGS := $(CCFLAGS)
MY_CFLAGS += $(EXTRA_CCFLAGS)
MY_CFLAGS += -std=gnu11
最下面的-std=gnu11就是启用了满足GNU规范的C11标准。然后,我们添加pureC.o:pureC.c
gcc $(INCLUDES) $(MY_CFLAGS) -o $@ -c $<
连接选项和make清除都一样加。这样,我们的PureC就能跑起来了。
Jetson TK下如何写汇编语言的更多相关文章
- 在基于Android以及Jetson TK平台上如何写32位的Thumb-2指令
由于Android以及Jetson TK的编译工具链中的汇编器仍然不支持大部分的32位Thumb-2指令,比如add.w,因此我们只能通过手工写机器指令码来实现想要的指令.下面我将简单地介绍如何在AR ...
- Windows环境下32位汇编语言程序设计(典藏版)
Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(9)ANSII字符大小写转大写
在罗云彬的<Windows环境下32位汇编语言程序设计>中第321页 ... .const szAllowedChar db '0123456789ABCDEFabcdef',08h .. ...
- 涨姿势:抛弃字母、数字和下划线写SHELL
PHP中异或 (^) 的概念 <?php echo"A"^"?";?> <?php echo"A"^"?&quo ...
- Windows环境下32位汇编语言程序设计(典藏版)
<Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...
- Windows环境下32位汇编语言程序设计笔记-基础篇
内存模式 .386 .model flat,stdcall ;子程序调用模式,win32中只能用stdcall,因为win32api调用使用的这个 option casemap:none ;定义了程序 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(2)配置环境
一直想买本罗云彬的Win32汇编书,现在终于出典藏版了,就买了本,读一读,涨涨姿势. 我把笔记本光驱拆下来添加了个硬盘,现在想装回去发现坏了,所以守着CD盘,代码却用的是第三版的,这真是个悲剧啊. - ...
- 1_jz2440在linux下烧写裸机程序
常用的烧写方法有: 1.使用并口工具烧写:接线(参考百问网JZ2440V2开发板使用手册),使用oflash烧写(速度比较慢),可烧写.bin文件,从新上电观察效果.可烧写u_boot. 2.使用op ...
- JDK1.8 StampedLock: 解决ReentrantReadWriteLock在读多写少情况下,写线程饥饿问题
ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading), 即如果执行中进行读取时,经常可能有另一执行要写入 ...
随机推荐
- Echarts如何添加鼠标点击事件?防止重复触发点击事件
Echarts如何添加鼠标点击事件? 1.通常我们只使用了以下代码,通过配置项和数据显示图表. var myChart = echarts.init(document.getElementById(' ...
- smart_ptr之shared_ptr
智能指针的概念 c++11标准和boost都提供了智能指针的功能.智能指针是普通指针的封装,智能指针是一个对象,对象里面包含了原生指针.可以使用智能指针对象的get()方法可获得封装在里面的原生指针. ...
- python-----多进程笔记
多进程笔记: 在Python中多进程的创建方式对比: 1.在Python中,可以通过os.fork()创建子进程,但是这种方式智能在'linux'和'unix'以及'mac'下面使用,不能跨平台,所以 ...
- Jupyter的学习
一 .Jupyter中的魔术命令 %load test.py :”可以将test.py 中的文件加载到jupyter框中 %matplotlib inline :可以将Matplotlib 的结果嵌 ...
- rabbitmq可靠性
本文翻译汇总自rabbitmq的官方文档. 翻译使用谷歌翻译后简单修改,部分内容读起来仍然比较晦涩,不过意思传达到了. 可靠性指南 本页介绍了如何使用AMQP和RabbitMQ的各种功能来实现可靠 ...
- 修改HTTPS加密协议TLS1.0为TLS1.2
一:首先为什么要改为TLS1.2 因为各大浏览器相继发布声明将停止支持 TLS 1.0 和 TLS 1.1 https://www.cnblogs.com/jpush88/p/9846047.html ...
- Vue -- element-ui FileSaver.js 导出
html <el-button type="danger" @click="exportRs">导出Excel报表</el-button> ...
- 【JUC系列第三篇】-CAS算法详解
作者 : 毕来生 微信: 878799579 1.CAS是什么? CAS是英文单词(Compare-And-Swap)的缩写,中文意思是:比较并替换.CAS需要有3个操作数:内存地址V,旧的预期值A, ...
- Codeforces Round #584 D. Cow and Snacks
链接: https://codeforces.com/contest/1209/problem/D 题意: The legendary Farmer John is throwing a huge p ...
- 巧用getdate()测试你的sql执行效率
在开发项目的过程中,我们会遇到各种各样的问题,有时候由于业务逻辑复杂,我们写的sql语句会很长很长,甚至会嵌套很多层,这个时候我就会担心sql执行时间会不会太长了?会不会有什么问题导致执行效率变慢?经 ...