脚本宝典收集整理的这篇文章主要介绍了树莓派ARM64汇编语言程序设计入门实验,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
参照实验参考数给出的代码实现arm64汇编语言实现找出最大数。将最大数设置在中间,为我的学号1320。
.section .data
.align 3
my_data:
.quad 1
.quad 2
.quad 5
.quad 1320
.quad 10
.quad 12
my_data_count:
.quad 6
.align 3
PRint_data:
.string "Big data: %dn"
.section .text
.globl main
main:
stp x29, x30, [sp, -16]!
ldr x0, =my_data
ldr x1, my_data_count
add x4, x0, #40
mov x3, xzr
1:
ldr x2, [x0], #8
cmp x2, x3
csel x3, x2, x3, hi
cmp x0, x4
b.ls 1b
ldr x0, =print_data
mov x1, x3
bl printf
ldp x29, x30, [sp], 16
ret
然后使用gcc test.S -o test -g --static
进行编译
运行结果为找出了最大的数:1320。
汇编程序是和机器语言最近的一种程序设计语言。对应不同的架构,汇编语言也不一样。这个汇编代码为arm64的,和以前学习的MIPS又不一样,更加复杂,功能还要多一些。
截图如下:
使用gdb --tui ./test
来进行调试。
b main
在main函数设置断点
上图为使用run
开始运行。
上图为使用s
单步执行。
上图为使用info reg
查看某寄存器值
编辑两个代码文件: 第一个是arm汇编代码文件compare.S:
.section .text
.globl compare_data
compare_data:
cmp x0, x1
csel x0, x0, x1, hi
ret
第二个是包含主函数的C代码文件:main.c:
#include <stdio.h>
extern int compare_data(int a, int b);
int main()
{
int val;
val = compare_data(1320,1234);
printf("bigger data is:%dn",val);
}
然后使用gcc compare.S main.c -o compare
就可以编译。
运行结果:
此实验和3-3很相似,这个就是反过来,比较函数用C写的,主函数用汇编写。 compare.c:
int compare_data(int a, int b)
{
return (a >= b) ? a : b;
}
main.S
[lzh@oPEnEuler 3-4]$ cat main.S
.section .data
.align 3
print_data:
.string "bigger data is:%dn"
.section .text
.globl main
main:
stp x29, x30, [sp, -16]!
mov x0, #6
mov x1, #5
bl compare_data
mov x1, x0
ldr x0, =print_data
mov x1, x0
ldr x0, =print_data
bl printf
ldp x29, x30, [sp], 16
ret
运行结果:
内联汇编编译:在C代码中嵌入汇编代码。 代码:
#include <stdio.h>
static int compare_data(int a, int b)
{
int val;
asm volatile(
"cmp %1, %2n"
"csel %0, %1, %2, hin"
: "+r" (val)
: "r" (a), "r"(b)
: "memory");
return val;
}
int main()
{
int val;
val = compare_data(5,6);
printf("big data: %dn", val);
val = compare_data(1234,1320);
printf("big data: %dn", val);
}
运行结果:
以上是脚本宝典为你收集整理的树莓派ARM64汇编语言程序设计入门实验全部内容,希望文章能够帮你解决树莓派ARM64汇编语言程序设计入门实验所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。