ARM汇编[0] hello world

news2024/11/28 3:43:46

文章目录

  • 简述
  • 寄存器
  • 语法
  • 系统调用
  • 例程

简述

如果不了解x86汇编的话建议先了解下,x86资料多、环境好搞、容易入门

阿尔可是急于求成的人,希望赶快看到成果;
所以本篇文章不会东讲西讲展开讲,只讲让hello world汇编能跑起来的关键点

说句感慨:本科的时候一直没学会汇编,对我来说最大的阻碍就是“通用寄存器”,压根就想不明白,什么通用?我给寄存器丢几个数,CPU怎么知道我放在哪个寄存器了?只是自己把数据左手倒右手的话确实通用,但在现代操作系统下,每个寄存器都有固定的用途,通用个🍑,,,

寄存器

ARM32的寄存器貌似叫r0 r1 r2 …
但是用这个名称在aarch64架构的平台编译不过,
ARM64的寄存器叫x0/w0、x1/w1… 对应rax/rbx
ARM64一共有x0-x30

全部的寄存器可以上网搜,这里说一下关键的
在这里插入图片描述
存放系统调用号的寄存器 x8
存放返回值的寄存器        x0

在这里插入图片描述
传递参数的寄存器x0-x5

好了,能传参、能执行系统调用、能拿返回值,就好比Minecraft里有了铲子、镐子和斧头
——虽然仍然一无所有,但是,可以开始建造属于自己的一切了


语法

立即数:AT&T汇编中用$标识,ARM汇编用#
地址:AT&T汇编中直接用标签,ARM汇编需要在前面加上=
指令顺序:AT&T汇编是ins src, dst,ARM汇编是inc dst, src,这点和x86汇编比较像
注释:AT&T汇编用#作注释,ARM汇编用//或/**/(我用#作注释也一样能编译运行,不知道汇编器是怎么区分注释和立即数的)
伪指令:因为都是GNU汇编器,所以AT&T汇编和ARM64基本一样

描述比较困难,等下直接看例程


系统调用

汇编里没有printf这么高级的封装函数可以使用,想要使用一些功能就需要系统调用了

在这里插入图片描述
上面的unistd文件放的是c库的声明,
下面的unistd文件放的的系统调用号
openEuler20.03和Ubuntu22系统上都是

在其中我们查看write系统调用的调用号和声明

调用号
在这里插入图片描述

声明
在这里插入图片描述

那么就可以知道,write的系统调用号在aarch64平台上是64,需要三个参数:文件描述符、内容、输出长度

例程

.data
	strr:   .string "hello world~\n"
	len = .-strr
.text
	.global _start
	// 以您对x86汇编的了解,相信我不注释您也明白↑↑↑这些细枝末节
_start:
	// write syscall
	mov     x8,     #64     
	mov     x0,     #1      // stdout
	ldr     x1,     =strr
	mov     x2,     len
	svc     #0				// execute syscall
	/*
	首先是把write的系统调用号放到x8寄存器
	然后参数1(文件描述符)就用标准输出来打印到控制台上
	参数2内容,这里填字符串的地址,(ARM不能用mov来访问地址这老生常谈了相信我不说您也知道)
	参数3 字符串长度
	svc #0执行系统调用
	*/

	// exit syscall
	mov     x8,     #93
	// use x0 as return value
	svc     #0
	/*
	但是write系统调用完之后紧接着就exit
	直接让write调用完后x0里保存的值作为exit的参数1,不需额外操作
	程序执行完后在shell执行echo $?可以看到write系统调用执行的结果
	*/

编译
as hello.s -o hello.o
ld hello.o -o hello

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1441112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 Python opencv 的人脸识别的酒店客房入侵系统的检测

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)

文章目录 2.1 规划高效的数据库架构2.1.1 基础知识2.1.2 重点案例:在线电商平台2.1.3 拓展案例 1:博客系统2.1.4 拓展案例 2:库存管理系统 2.2 数据类型和表设计2.2.1 基础知识2.2.2 重点案例:个人健康记录应用2.2.3 拓展案例 1&a…

数字信号处理 试题 复盘解答(八)

数字信号处理 试题 复盘解答(八) ps:仅 用作复盘 和回顾知识点,如果有疑问或者错误请提出。 涉及年份 :19 - 21年 六、 个人感觉缺少条件 七、 使用双线性变换法对一个最小相位模拟滤波器进行数字化得到的数字滤波器一般来说不再…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接: 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record,示例内容如下:。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

app逆向-android-studio安装使用教程

Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 android-studio下载地址:https://developer.android.com/studio/archive androi…

第59讲订单数据下拉实现

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;/*** 订单查询 type值 0 全部订单 1待付款 2 待收货 3 退款/退货* param type* return*/RequestMapping("/list")public R list(Integer type,Integer page,Integer pageSize){System.out.pri…

Flink从入门到实践(二):Flink DataStream API

文章目录 系列文章索引三、DataStream API1、官网2、获取执行环境(Environment)3、数据接入(Source)(1)总览(2)代码实例(1.18版本已过时的)(3&…

服务器与电脑的区别?

目录 一、什么是服务器 二、什么是电脑 三、服务器和电脑的区别 一、什么是服务器 服务器是指一种专门提供计算和存储资源、运行特定软件服务的物理或虚拟计算机。服务器主要用于接受和处理来自客户端(如个人电脑、手机等)的请求,并向客户…

制作耳机壳的UV树脂和塑料材质相比优势有哪些?

制作耳机壳的UV树脂相比塑料材质有以下优势: 高强度与耐磨性:UV树脂具有高强度和耐磨性,能够更好地保护耳机内部零件,延长耳机使用寿命。相比之下,塑料材质可能较易磨损或刮伤。耐高温:UV树脂具有较好的耐…

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记

目录 Shiro简介 复现流程 工具一把梭 半脚本半手动 原理分析 反序列化入口 常见的key 登录过程 验证过程 利用原理 Shiro简介 Apache Shiro 是一个强大且易于使用的 Java 安全框架,用于身份验证、授权、加密和会话管理等安全功能。Shiro 的设计目标是简单…

什么是向量数据库?为什么向量数据库对LLM很重要?

由于我们目前生活在人工智能革命之中,重要的是要了解许多新应用程序都依赖于向量嵌入(vector embedding)。因此,有必要了解向量数据库以及它们对 LLM 的重要性。 我们首先定义向量嵌入。向量嵌入是一种携带语义信息的数据表示形式…

springboot172基于springboot的二手车交易系统的设计与实现

二手车交易系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&…

armbian ddns

参考https://mp.weixin.qq.com/s/0Uu_nbGH_W6vAYHPH4kHqg Releases jeessy2/ddns-go GitHub mkdir -p /usr/local/ddns-go cd /usr/local/ddns-gowget https://github.com/jeessy2/ddns-go/releases/download/v6.1.1/ddns-go_6.1.1_freebsd_armv7.tar.gztar zxvf ddns-go_…

【XR806开发板试用】轻松连上华为云实现物联网

本文为极术社区XR806试用活动文章。 一.开始 偶然的机会在网上看到了鸿蒙开发板的试用,作为一个"老鸿蒙"岂能放弃这个机会,报名之后不出意料地得到了使用名额,在此感谢极术社区. 收到开发板之后其实还有点失望了,就那么一个小小的核心板,其他啥也没有,连一根数据线…

【PyQt】08 - 编辑Tab顺序

文章目录 前言一、Tab顺序二、编辑Tab顺序总结 前言 介绍了什么是Tab顺序,以及如何修改Tab顺序。 一、Tab顺序 当你的界面设计好之后,在输入栏按住Tab按键,他会按照你摆放的顺序一次转跳 二、编辑Tab顺序 方法一 然后鼠标左击就可以改变…

CTFshow web(php命令执行 45-49)

基础知识&#xff1a; 1.绕过cat使用&#xff1a; tac more less head tac tail nl od(二进制查看) vi vim sort uniq rev 2.绕过空格用&#xff1a; %09 <> ${IFS} $IFS$ {cat,fl*} %20 注&#xff1a; %09 ##&#xff08;Tab&#xff09; %20 ##&#xff08;spa…

Swift Combine 发布者publisher的生命周期 从入门到精通四

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三 1. 发布者和订阅者的生命周期 订阅者和发布者以明确定义的顺序进行通信&#xff0c;因此使得它们具有从开始到结束的生命周期&#xff1a; …

MATLAB环境下基于深层小波时间散射网络的ECG信号分类

2012年&#xff0c;法国工程学院院士Mallat教授深受深度学习结构框架思想的启发&#xff0c;提出了基于小波变换的小波时间散射网络&#xff0c;并以此构造了小波时间散射网络。 小波时间散射网络的结构类似于深度卷积神经网络&#xff0c;不同的是其滤波器是预先确定好的小波…

Postman(接口测试工具),什么是Postman接口

目录 一.基本介绍 Postman 是什么Postman 快速入门快速入门需求说明 二.Postman 完成 Controller 层测试 需要的代码&#xff1a; Java类request.jspsuccess.jsp1. 完成请求2. 完成请求3. 完成请求4. 完成请求5. 完成请求 三.发送join 目录 一.基本介绍 Postman 是什么 …

Redis核心技术与实战【学习笔记】 - 31.番外篇:Redis客户端如何与服务器端交换命令和数据

简述 Redis 使用 RESP 协议&#xff08;Redis Serialzation Protocol&#xff09;协议定义了客户端和服务器端交互的命令、数据的编码格式。在 Redis 2.0 版本中&#xff0c;RESP 协议正式称为客户端和服务器端的标准通信协议。从 Redis 2.0 到 Redis 5.0 &#xff0c;RESP 协…