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), 即如果执行中进行读取时,经常可能有另一执行要写入 ...
随机推荐
- php使用播放插件播放m3u8,mp4,flv格式的视频
一.这里我主要是播放m3u8的视频,有两款比较好的插件,swise和ckpalyer,我介绍的是ckplayer,这是在pc端播放的,并且是需要flash支持的,不过现在的最新浏览器都是默认安装的 二 ...
- 「Django」Xadmin应用
第一:命令安装xadmin2 pip install xadmin2 第二:setting.py中设置 INSTALLED_APPS INSTALLED_APPS = ( ... 'xadmin', ...
- 使用JXL组件操作Excel和导出文件
这段时间参与的项目要求做几张Excel报表,由于项目框架使用了jxl组件,所以把jxl组件的详细用法归纳总结一下.本文主要讲述了以下内容: JXL及相关工具简介 如何安装JXL JXL的基本操作 创建 ...
- 再论i++ ++i
#include <stdio.h> int main(void) { char acData[5] ={'A','B','C','D','E'}; char *pcData = NULL ...
- IMEI手机串码和serialno
IMEI 1.IMEI是什么 国际移动设备识别码(International Mobile Equipment Identity number,IMEI),俗称“手机串号”.“手机串码”.“手机序列号 ...
- [hdoj4578][多延迟标记的线段树]
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- [Google Guava] 3-缓存
原文地址 译文地址 译者:许巧辉 校对:沈义扬 范例 01 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() ...
- tarjan模板(带注释)
//dfsn[x]记录x节点有没有被访问过,有,则是第几个 //lowlink[x]记录x能到的祖先中编号最小的 //dfs_clock是个编号累计器 //scc记录一个 inline void df ...
- gcc 带参数进行编译
gcc -DYES -o helloyes hello.c 在hello.c中存在 #ifdefine YES ........
- .netcore signalR 实时消息推送
服务器端引入包 Install-Package Microsoft.AspNetCore.SignalR客户端引入包 npm install @aspnet/signalr <template ...