樹莓派實驗指導第三章實驗
阿新 • • 發佈:2021-10-30
樹莓派實驗指導第三章實驗
實驗 3-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: %d\n" .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 test3.2.S -o test3.2 -g --static
隨後我們除錯程式碼:gdb test3.2
實驗 3-3:組合語言練習——通過 C 語言調用匯編函式
使用匯編語言實現一個彙編函式,用於比較兩個數的大小並返回最大值,然後用
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);
}
我們編譯程式碼:gcc 3.3main.c 3.3compare.S -o 3.3main
編譯執行:
實驗 3-4:組合語言練習——通過組合語言呼叫 C 函式
使用 C 語言實現一個函式,用於比較兩個數的大小並返回最大值,然後用匯編代
碼呼叫這個 C 函式。程式可使用 GCC(Aarch64 版本)來編譯,並且可在樹莓派 Linux系統或者 QEMU + ARM64 實驗平臺上執行。
int compare_data(int a, int b)
{
return (a >= b) ? a : b;
}
.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
編譯程式碼:gcc 3.4compare.c 3.4main.S -o 3.4mian
執行程式碼:
實驗 3-5:組合語言練習——GCC 內聯彙編
使用 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);
}
編譯執行: