ZZU-ARM汇编语言实验 3&4

实验三

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
相关推荐
AndyHeee6 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影6 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen6 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
ThornArmor6 天前
【工具篇·番外】跨语言生态的主权回收:基于 ISA 说明书的 4-bit 双向汇编系统全线封顶
c语言·开发语言·汇编·c++·重构·架构
振南的单片机世界6 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件
墨绿色的摆渡人6 天前
论文笔记(一百三十七)Learning Dual-Arm Push and Grasp Synergy in Dense Clutter
arm开发·论文阅读
暮云星影6 天前
全志linux开发屏幕适配(一)屏幕参数设置说明
linux·arm开发
是星辰吖~7 天前
WIN32_线程(下)
汇编
m0_547486667 天前
《ARM Cortex-M4嵌入式应用技术——基于STM32F407、STM32CubeMX与Proteus》全套PPT课件
arm开发·stm32·proteus
Lanceli_van7 天前
SQLite 3.45.2(sqlite-autoconf-3450200)ARM 交叉编译完整步骤
arm开发·sqlite