实验三
TypeScript
.section .data
src_str: .string "Hello, ARM64!"
dst_str: .space 20
.section .text
.global main
main:
stp x29, x30, [sp, -16]!
adr x0, src_str
adr x1, dst_str
bl string_copy
adr x0, dst_str
bl dispmsg
bl dispcrlf
mov x0, 0
ldp x29, x30, [sp], 16
ret
string_copy:
copy_loop:
ldrb w2, [x0]
strb w2, [x1]
cmp w2, #0
beq end_copy
add x0, x0, #1
add x1, x1, #1
b copy_loop
end_copy:
ret
实验四
(1)汇编语言调用C函数(返回两个int整数中的较大者)。
比较函数:C代码文件compare.c。
主程序:ARM汇编代码文件main.s。
新建一个exp4的文件夹,实现下方代码
compare.c
TypeScript
int compare(int a, int b) {
return (a > b) ? a : b;
}
main.s
TypeScript
.section .data
val1: .word 10
val2: .word 25
.section .text
.global main
main:
stp x29, x30, [sp, -16]!
ldr x0, =val1
ldr w0, [x0]
ldr x1, =val2
ldr w1, [x1]
bl compare
uxtw x0, w0
bl dispsix
bl dispcrlf
ldp x29, x30, [sp], 16
ret
编译执行
bash
cd ./exp4
gcc -o compare main.s compare.c ../libtest.a
./compare
(2)C语言调用汇编子程序(实验三字符串复制)。
字符串复制子程序:ARM汇编代码文件strcpy1.s。
主函数:C代码文件main.c。
同样是在exp4文件夹下进行
strcpy1.s
TypeScript
.section .text
.global strcpy1
strcpy1:
copy_loop:
ldrb w2, [x0]
strb w2, [x1]
cmp w2, #0
beq end_copy
add x0, x0, #1
add x1, x1, #1
b copy_loop
end_copy:
ret
main.c
TypeScript
#include <stdio.h>
extern void strcpy1(char* src, char* dst);
int main() {
char src[] = "Hello, ARM64!";
char dst[20];
strcpy1(src, dst);
printf("%s\n", dst);
return 0;
}
编译执行
bash
gcc strcpy1.s main.c -o strcpy_program
./strcpy_program
(3)C代码中嵌入汇编代码(返回两个int整数中的较大者)。
main_3.c
注意文件名是main_3.c,因为(2)中已经建立了main.c文件了,所以取了一个别名.
当然你想设置成其他文件名也可以,编译执行的时候相应地调整即可!
TypeScript
#include <stdio.h>
int max(int a, int b) {
int result;
asm(
"cmp %1, %2\n\t"
"b.le L_else\n\t"
"mov %0, %1\n\t"
"b L_end\n"
"L_else:\n\t"
"mov %0, %2\n"
"L_end:"
: "=r" (result)
: "r" (a), "r" (b)
: "cc"
);
return result;
}
int main() {
int num1 = 10;
int num2 = 20;
int maximum = max(num1, num2);
printf("The maximum of %d and %d is %d\n", num1, num2, maximum);
return 0;
}
编译执行
bash
gcc main_3.c -o max_program
./max_program