首页 > 编程知识 正文

网站开发环境有哪些,汇编语言环境搭建

时间:2023-05-05 14:30:27 阅读:170497 作者:3708

第一个极术社区

作者:智元珠

如果您对Arm相关技术感兴趣,欢迎私信aijishu20加入技术微信群。

摘要近年来,Arm服务器发展势头迅猛,但大多数人的电脑还处于x86环境,不便于开发。

本文介绍了如何在x86环境中基于Qemu和Docker快速构建AARCH64开发环境。

您可以从docker-hub下载到名为de v4 arm 64/a arch 643360 Ubuntu _ 19.04 _ SVE的docker image。

读者可以使用在“准备AARCH64开发环境”部分中提供的命令来进入AARCH64开发环境。 也可以使用附录中提供的方法手动创建开发环境。

到目前为止,官方版本的gcc不支持SVE intrinsics。

但是,github上的gcc-mirror仓库包含aarch64/sve-acle-branch的分支,您可以从sve acle分支的源代码中手动编译支持SVE intrinsics的gcc编译器。

更多信息请参考参考文献[2]。

本文的AARCH64开发环境包括一个手动编译的gcc,以支持SVE intrinsics的编译。

启用SVE intrinsics的编译器位于开发环境的/home/dev/hhdbz/gcc_sve/目录下。

以下所有支持SVE intrinsics的gcc编译器均内置于de v4 arm 64/a arch 643360 Ubuntu _ 19.04 _ svedockerimage中: 本文是AARCH64开发系列文章的第一篇。 以下假设所有代码都存储在~/work目录中。

AARCH64开发环境准备安装有ubuntu18.04 (以后的版本也可以是近似版本)的x86电脑,执行以下命令进入AARCH64开发环境。

sudo apt-getinstallqemu-user wget ' https://raw.github user content.com/QEMU/QEMU/master/scripts/qmu-hdbzfmt-com QEMU-hhdbzfmt-conf.sh-QEMU-path/usr a arch 64: Ubuntu _ 19.04 _ SVE # getdockerimagesudodockerrun---RM-v~RM-v

本文的实验代码可从参考文献[5]中下载。

AARCH64基本汇编编译运行

切换到目录~/work/aarch64_asm,有内置的aarch64的基本汇编测试程序。 如下

$ cat hello.s.arch armv8- a.text.align2. global main.type main,%functionmain: stp x29,x30,[sp,-16]! adrp x0、hello_str add x0、x0、 lo 12: hello _ strblprintfmovx 0、0 ldpx 29、x30、[sp]、16ret.section.rodata

$ makeruncleangcchello.s-o hello./hellohelloaarch 64rm-f hello *.OA arch 64 neon编译执行neon的测试代码在目录(~/work/neon

AARCH64 Neon汇编编译运行

这是一个批量处理和相加16个unsigned char类型数据的示例,运行make run_asm clean时将显示以下内容

$ make run _ asmcleancc-c-one on _ add3. one on _ add3. SCC-g-wall-March=armv 8.2-a-O2-c-one on _ add3_

on_add3name: data0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15name: data (new)3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18rm -f *.o neon_add3 neon_hello AARCH64 Neon intrinsics 编译运行

这是一个用neon计算 1,2,3 … 加到99 的例子,运行 make run_intrinsics clean 结果如下

$ make run_intrinsics cleancc -g -Wall -march=armv8.2-a -O2 -c -o neon_hello.o neon_hello.ccc neon_hello.o -o neon_hello./neon_hellosum=4950rm -f *.o neon_add3 neon_hello AARCH64 SVE 编译运行

SVE 的测试代码在目录 ~/work/sve 下面。

AARCH64 SVE 汇编编译运行

这是通过sve指令计算字符串长度的例子,运行 make run_asm clean 结果如下

注意: arm sve 指令是 armv8.2 开始支持的,因此 -march 后面的参数是: armv8.2-a+sve

$ make run_asm cleancc -c -o sve_strlen.o sve_strlen.S/home/dev/hhdbz/gcc_sve/hhdbz/aarch64-linux-gnu-gcc -g -Wall -march=armv8.2-a+sve -O2 -c -o sve_strlen_test.o sve_strlen_test.ccc sve_strlen.o sve_strlen_test.o -o sve_strlen./sve_strlenlen=9 of "hello sve"rm -f *.o sve_strlen sve_hello

因为这个例子的代码量比较少,因此贴出 source code 的源代码,更多内容,
见参考文献 [6]

$ cat sve_strlen.S// reference: https://alastairreid.github.io/papers/sve-ieee-micro-2017.pdf .arch armv8.2-a+sve .text .align 2 .global sve_strlen .type sve_strlen, %functionsve_strlen: mov x1, x0 ptrue p0.b.loop: setffr ldff1b z0.b, p0/z, [x1] rdffr p1.b, p0/z cmpeq p2.b, p1/z, z0.b, #0 brkbs p2.b, p1/z, p2.b incp x1, p2.b b.last .loop sub x0, x1, x0ret AARCH64 SVE intrinsics 编译运行

这是一个通过 sve intrinsics 做批量运算的例子,运行 make run_intrinsics clean 结果如下

$ make run_intrinsics clean/home/dev/hhdbz/gcc_sve/hhdbz/aarch64-linux-gnu-gcc -g -Wall -march=armv8.2-a+sve -O2 -c -o sve_hello.o sve_hello.ccc sve_hello.o -o sve_hello./sve_hello0.988095 0.988095 0.988095, 0.000000, 0.9880951.488095 1.488095 1.488095, 0.500000, 0.9880951.654762 1.654762 1.654762, 0.666667, 0.9880951.738095 1.738095 1.738095, 0.750000, 0.9880951.788095 1.788095 1.788095, 0.800000, 0.9880951.821429 1.821429 1.821429, 0.833333, 0.9880951.845238 1.845238 1.845238, 0.857143, 0.9880951.863095 1.863095 1.863095, 0.875000, 0.9880951.876984 1.876984 1.876984, 0.888889, 0.9880951.888095 1.888095 1.888095, 0.900000, 0.988095rm -f *.o sve_strlen sve_hello 附录

下载附件:ubuntu-19.04-dockerfile 和 docker-build.sh,
在命令行上输入如下命令,等待一段时间,环境就会创建成功。

./docker-build.sh

参考文献

[1] SVE in QEMU’s linux-user mode

[2] 交叉编译支持SVE ACLE的gcc

[3] qemu-user-static release

[4] ARM64编译工具链下载

[5] AARCH64 sample code

[6] Alastair Reid’ page

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。