1. 程式人生 > 其它 >樹莓派實驗指導第三章實驗

樹莓派實驗指導第三章實驗

樹莓派實驗指導第三章實驗


實驗 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);
} 

編譯執行: