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), 即如果执行中进行读取时,经常可能有另一执行要写入 ...
随机推荐
- windows使用msi包安装mysql8.0.12
1.前言 利用windows提供的二进制分发包(msi)安装是非常简单的,只要根据提示安装就可以了,和安装普通软件没有什么区别.但是如果想在安装的时候就把规划的配置好,是需要看懂每个步骤到底做什么用, ...
- Free lunch is over
译文:http://www.mamicode.com/info-detail-1324737.html 原文:http://www.gotw.ca/publications/concurrency-d ...
- 测试某网站的SMS验证码
to=18911121211&sms_type=sms_registration&captcha_num=9JCMw4yN5EjI6ISYoNGdwF2YiwiIw5WNwlmb3xm ...
- JAVA遇见HTML——JSP篇:JSP内置对象(上)
JSP九大内置对象 JSP内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象. <% int[] value={60,70,80}; for(int i:value){ o ...
- mysql数据库高并发处理
总体思想:短, 少, 分流 短: 1.页面静态化, 2.使用缓存 3.使用存储过程, 对于处理一次请求需要多次访问数据库的操作, 将操作整合到存储过程, 这样只需要一次数据库访问 4.延迟修改, 将修 ...
- python MySQL安装依赖报错的坑
0X01 问题 MySQL-python是python调用MySQL的常用库 通常安装时会遇到某些坑. EnvironmentError: mysql_config not found yum -y ...
- Java8-Executors-No.02
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import ...
- Win10远程桌面 报错:CredSSP加密Oracle修正……
解决方法: 运行 gpedit.msc 本地组策略: 计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击. 参考: https://blog.c ...
- python--第六天练习题
#1.正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2 ...
- mysql远程服务密码修改
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; FLUSH PRIVILEGE ...