当前位置: 首页 > news >正文

ZZU-ARM汇编语言实验 34

实验三

.section .data
src_str: .string "Hello, ARM64!"
dst_str: .space 20.section .text
.global main
main:stp x29, x30, [sp, -16]!adr x0, src_stradr x1, dst_strbl string_copyadr x0, dst_strbl dispmsgbl dispcrlfmov x0, 0ldp x29, x30, [sp], 16retstring_copy:
copy_loop:ldrb w2, [x0]strb w2, [x1]cmp w2, #0beq end_copyadd x0, x0, #1add x1, x1, #1b copy_loop
end_copy:ret

实验四

(1)汇编语言调用C函数(返回两个int整数中的较大者)。

比较函数:C代码文件compare.c。

主程序:ARM汇编代码文件main.s。

新建一个exp4的文件夹,实现下方代码

compare.c

int compare(int a, int b) {return (a > b) ? a : b;
}

main.s

.section .data
val1: .word 10
val2: .word 25.section .text
.global main
main:stp x29, x30, [sp, -16]!ldr x0, =val1ldr w0, [x0]ldr x1, =val2ldr w1, [x1]bl compareuxtw x0, w0bl dispsixbl dispcrlfldp x29, x30, [sp], 16ret

编译执行

cd ./exp4
gcc -o compare main.s compare.c ../libtest.a
./compare

(2)C语言调用汇编子程序(实验三字符串复制)。

字符串复制子程序:ARM汇编代码文件strcpy1.s。

主函数:C代码文件main.c。

同样是在exp4文件夹下进行

strcpy1.s

.section .text
.global strcpy1
strcpy1:
copy_loop:ldrb w2, [x0]strb w2, [x1]cmp w2, #0beq end_copyadd x0, x0, #1add x1, x1, #1b copy_loop
end_copy:ret

main.c

#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;
}

编译执行

gcc strcpy1.s main.c -o strcpy_program
./strcpy_program

(3)C代码中嵌入汇编代码(返回两个int整数中的较大者)。

main_3.c

注意文件名是main_3.c,因为(2)中已经建立了main.c文件了,所以取了一个别名.

当然你想设置成其他文件名也可以,编译执行的时候相应地调整即可!

#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;
}

编译执行

gcc main_3.c -o max_program
./max_program

http://www.xdnf.cn/news/975223.html

相关文章:

  • 【Rust UDP编程】rust udp编程方法解析与应用实战
  • uni-app bitmap.load() 返回 code=-100
  • XSP30是一款2~3节串联锂电池/锂离子电池升降压充电管理IC
  • Snipaste:轻量级截图,高效编辑
  • Spring中@Value注解:原理、加载顺序与实战指南
  • Springboot项目的目录结构
  • 西门子 SINAMICS S200伺服,重塑汽车焊接工艺新标准
  • 技术革新,EtherCAT转CAN网关,新能源汽车电池产线再升级
  • 汽车租赁小程序开发指南
  • Spark提交流程
  • SQL 注入:iBatis与修复
  • Charles里怎么进行断点调试
  • TripGenie:畅游济南旅行规划助手:团队工作纪实(十四)
  • 附加模块--Qt SQL模块功能及架构解析
  • SpringCloud系列 - Nacos 配置中心(二)
  • Hadoop 2.7.7 单机伪分布式安装与配置教程(JDK 8)
  • 如何设计三高架构
  • 小米玄戒O1架构深度解析(二):多核任务调度策略详解
  • 【系统设计【1】】系统设计面试方法论:从0到百万用户的需求到架构的推演
  • RPG24.设置武器伤害(二):将效果应用于目标
  • defaultdict 在python中的作用
  • 传输层协议 TCP 介绍 -- TCP协议格式,确认应答机制,超时重传机制,连接管理机制,滑动窗口,流量控制,拥塞控制,延迟应答,捎带应答
  • 告别尺寸混乱!CAD 快速看图【比例】功能精准校准,测量标注零误差
  • 批量转灰度图和调整图片大小
  • 如何在 TypeScript 中使用类型保护
  • Vim鼠标右键复制问题解决方法
  • java转PHP开发需要几步?
  • PHP基础-语法变量
  • LVS 负载均衡详解:四层转发原理与三种经典模式全面解析
  • 谈文件系统