3.2 实验 3-2:汇编语言练习——查找最大数
1.实验目的
通过本实验了解和熟悉 ARM64 汇编语言。
2.实验要求
使用 ARM64 汇编语言来实现如下功能:在给定的一组数中查找最大数。程序可使GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。
.section .data
.align 3
my_data:
.quad 1
.quad 2
.quad 5
.quad 8
.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
运行结果:
调试信息:
在main函数里设置一个断点,并输入“r”命令运行test程序,然后就可以单步调试test程序了。输入“s”进行单步调试:
可以使用“info reg”命令来查看寄存器的值。例如查看x0寄存器的值。
3.3 实验 3-3:汇编语言练习——通过 C 语言调用汇编函数
1.实验目的
通过本实验了解和熟悉 C 语言中如何调用汇编函数。
2. 实验要求
使用汇编语言实现一个汇编函数,用于比较两个数的大小并返回最大值,然后用C 语言代码调用这个汇编函数。程序可使用 GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。
//compare.S 文件如下: .section .text .globl compare_data compare_data: cmp x0, x1 csel x0, x0, x1, hi ret //main.c 文件如下。 #includeextern int compare_data(int a, int b); int main() { int val; val = compare_data(5, 6); printf("big data: %dn", val); }
运行结果:
3.4 实验 3-4:汇编语言练习——通过汇编语言调用 C 函数
1.实验目的
通过本实验了解和熟悉汇编语言中如何调用 C 函数。
2.实验要求
使用 C 语言实现一个函数,用于比较两个数的大小并返回最大值,然后用汇编代码调用这个 C 函数。程序可使用 GCC(Aarch64 版本)来编译,并且可在树莓派 Linux系统或者 QEMU + ARM64 实验平台上运行。
//compare.c 文件如下。
int compare_data(int a, int b)
{
return (a >= b) ? a : b;
}
//main.S 文件如下。
.section .data
.align 3
print_data:
.string "big data: %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
bl printf
ldp x29, x30, [sp], 16
ret
运行结果:
3.5 实验 3-5:汇编语言练习——GCC 内联汇编
1.实验目的
通过本实验了解和熟悉 GCC 内联汇编的使用。
2.实验要求
使用 GCC 内联汇编实现一个函数,用于比较两个数的大小并返回最大值,然后用 C 语言代码调用这个函数。程序可使用 GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。
#includestatic 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(6, 4); printf("big data: %dn", val); }
运行结果:



