ARM汇编[0] hello world

文章目录

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

简述

如果不了解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.mfbz.cn/a/380698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2 月 9 日算法练习- 数据结构 - 除夕快乐♪٩(´ω`)و♪

翻转括号序列 暴力过20%数据 思路&#xff1a;括号合法序列问题可以利用前缀和&#xff0c;将"(“看成 1&#xff0c;”)"看成 0&#xff0c;规律是到某个位置为止的前缀和>0并且到最后前缀和0。 #include<bits/stdc.h> using namespace std; const int N…

鸿蒙原生应用再添新丁!央视新闻 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;央视新闻 入局鸿蒙 来自 HarmonyOS 微博2月9日消息&#xff0c;#央视新闻启动鸿蒙原生应用开发#中央广播电视总台旗舰央视新闻客户端正式宣布&#xff0c;将基于HarmonyOS NEXT鸿蒙星河版&#xff0c;启动央视新闻 鸿蒙原生应用开发&#xf…

扑克牌大小(模拟)

题目 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();String[] ss s.split("-");StringBuffer s1 new StringBuffer();StringBuffer s2 new StringBuffer(…

Java基础知识总结(持续更新中)

Java基础知识&#xff08;持续更新&#xff09; 类型转化&#xff1a;数字、字符串、字符之间相互转化 数字 <-> 字符串 // 数字转字符串 // method1int number 5;String str String.valueOf(number);// method2int number 5;Integer itr number; //int装箱为对…

vue3 之 通用组件统一注册全局

components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字&#xff0c;组件配置对象)…

moduleID的使用

整个平台上有很多相同的功能&#xff0c;但是需要不同的内容。例如各个模块自己的首页上有滚动新闻、有友好链接等等。为了公用这些功能&#xff0c;平台引入了moduleID的解决方案。 在前端的配置文件中&#xff0c;配置了模块号&#xff1a; 前端页面请求滚动新闻时&#xff0…

一款VMP内存DUMP及IAT修复工具

前言 加壳是恶意软件常用的技巧之一&#xff0c;随着黑客组织技术的不断成熟&#xff0c;越来越多的恶意软件家族都开始使用更高级的加壳方式&#xff0c;以逃避各种安全软件的检测&#xff0c;还有些恶意软件在代码中会使用各种多态变形、加密混淆、反调试、反反分析等技巧&a…

基于JAVA的教学资源共享平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

单片机学习笔记---DS1302时钟

上一节我们讲了DS1302的工作原理&#xff0c;这一节我们开始代码演示。 新创建一个工程写上框架 我们需要LCD1602进行显示&#xff0c;所以我们要将LCD1602调试工具那一节的LCD1602的模块化代码给添加进来 然后我们开始创建一个DS1302.c和DS1302.h 根据原理图&#xff0c;为了…

005集——shp格式数据转换乱码问题——arcgis

shp数据格式与其他数据格式转换过程中会遇到乱码等问题&#xff0c;原因如下&#xff1a; 在Shapefile头文件&#xff08;dBase Header&#xff09;中&#xff0c;一般会包含字符编码信息&#xff0c;这个信息称为 LDID &#xff08; Language Driver ID&#xff09;。在使用ar…

博主:今日无更

今天放个假&#xff0c;不更新文章 &#xff08;占位符&#xff09;

龙芯开启ssh服务——使用Putty连接

本文采用龙芯3A6000处理器&#xff0c;Loongnix操作系统。 为了能使用其他电脑远程操控龙芯电脑&#xff0c;需要打开loongnix的ssh服务&#xff0c;并在其他电脑里使用putty连接loongnix。 1 修改ssh配置文件 命令行输入&#xff1a; sudo vim /etc/ssh/sshd_config按下i插…

防疫物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

问题:A注册会计师必须在期中实施实质性程序的情形是()。 #学习方法#其他

问题&#xff1a;A注册会计师必须在期中实施实质性程序的情形是&#xff08;&#xff09;。 A&#xff0e;甲公司整体控制环境不佳 B&#xff0e;将期中实质性程序所获证据与期末数据进行比较 C&#xff0e;评估的认定层次重大错报风险很高 D&#xff0e;没有把握通过在期中…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(七)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十六章&#xff1a;使用 RNN 和注意力进行自然语言处理 当艾伦图灵在 1950 年想象他著名的Turing 测试时&#xff0c;他提出了…

leetcode(双指针)283.移动零(C++详细题解)DAY3

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例 1: 输入…

C语言每日一题(52)单值二叉树

力扣网 965 单值二叉树 题目描述 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;t…

MySQL数据库⑦_复合查询+内外链接(多表/子查询)

目录 1. 回顾基本查询 2. 多表查询 2.1 笛卡尔积初步过滤 3. 自连接 4. 子查询 4.1 单行子查询 4.2 多行子查询 4.2 多列子查询 4.2 from子句中使用子查询 5. 合并查询 6. 内外链接 6.1 内连接 6.2 左外链接 6.2 右外连接 本篇完。 1. 回顾基本查询 先回顾一下…

ctfshow-web11~20-WP

web11 根据提示,查询对ctfshow域名进行dns查询,查看TXT记录 阿里云查询链接:阿里云网站运维检测平台 获取flag成功 web12 根据题目提示,我们访问robots.txt,获取到后台地址 然后我们访问一下后台

Linux线程 分离和同步与互斥 条件变量

Linux线程 分离和同步与互斥 条件变量 1. 分离线程2. 线程互斥与互斥量3. 线程同步与竞态条件4. pthread库与条件变量5. 生产者-消费者 1. 分离线程 什么是线程分离&#xff1f; 线程分离是指线程在结束时&#xff0c;操作系统会自动回收其资源&#xff0c;而无需其他线程显式地…
最新文章