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 12my_data_count:.quad 6.align 3
print_data:.string "big data: %d\n".section .text
.globl main
main:stp x29, x30, [sp, -16]!ldr x0, =my_dataldr x1, my_data_countadd x4, x0, #40mov x3, xzr
1:ldr x2, [x0], #8cmp x2, x3csel x3, x2, x3, hicmp x0, x4b.ls 1bldr x0, =print_datamov x1, x3bl printfldp x29, x30, [sp], 16ret
運行結果:
調試信息:
在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 文件如下。
#include <stdio.h>
extern int compare_data(int a, int b);
int main()
{
int val;
val = compare_data(5, 6);
printf("big data: %d\n", 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: %d\n"
.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 實驗平臺上運行。
#include <stdio.h>
static int compare_data(int a, int b)
{
int val;
asm volatile (
"cmp %1, %2\n""csel %0, %1, %2, hi\n": "+r" (val): "r" (a), "r" (b): "memory");
return val;
}
int main()
{
int val;
val = compare_data(5, 6);
printf("big data: %d\n", val);
val = compare_data(6, 4);
printf("big data: %d\n", val);
}
運行結果:
?
總結
以上是生活随笔為你收集整理的OpenEuler树莓派基础实验 20212802范辰宇的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。