ARM汇编【1】:数据类型

       与高级语言类似,ARM支持对不同数据类型的操作。我们可以加载或存储的数据类型可以是有符号和无符号字、半字或字节。这些数据类型的扩展名是:-h或-sh表示半字,-b或-sb表示字节,不表示字的扩展名。有符号数据类型或无符号数据类型之间的区别在于:

  •      带符号的数据类型可以同事包含正值和负值,因此范围值较低
  •      无符号数据类型可以包含大的正值(包括零),但不能包含负值,因此范围更广。

以下是这些数据类型如何与Load和Store指令的使用示例:

ldr = Load Word
ldrh = Load unsigned Half Word
ldrsh = Load signed Half Word
ldrb = Load unsigned Byte
ldrsb = Load signed Bytesstr = Store Word
strh = Store unsigned Half Word
strsh = Store signed Half Word
strb = Store unsigned Byte
strsb = Store signed Byte

端序 

     有两种查看内存中字节的基本方法:小字节(LE)或大字节(BE)。区别在于对象的每个字节存储在内存中的字节顺序。在像Intel x86这样的小端机器上,最低有效字节存储在最低地址(最接近零的地址)。在big-endian机器上,最高有效字节存储在最低地址。ARM体系结构在版本3之前是小端序,从那时起就是双端序,这意味着它具有允许切换端序的设置。例如,在ARMv6上,指令是固定的小端序,数据访问可以是小端序或大端序,由程序状态寄存器(CPSR)的位9(E位)控制

ARM寄存器

      寄存器的数量取决于ARM版本。根据ARM参考手册,除基于ARMv6-M和ARMv7-M的处理器外,共有30个通用32位寄存器。前16个寄存器可在用户级模式下访问,其他寄存器可在特权软件执行中使用(ARMv6-M和ARMv7-M除外)。在本系列教程中,我们将使用在任何特权模式下都可以访问的寄存器:r0-15。这16个寄存器可以分为两组:通用寄存器和专用寄存器。

 下表只是ARM寄存器如何与英特尔处理器中的寄存器相关的一个对比。

 R0-R12:可在常见操作期间用于存储临时值、指针(指向内存的位置)等。例如,R0可在算术操作期间被称为累加器,或用于存储先前调用的函数的结果。R7在处理系统调用时变得很有用,因为它存储系统调用编号,R11帮助我们跟踪用作帧指针的堆栈上的边界(稍后将介绍)。此外,ARM上的函数调用约定指定函数的前四个自变量存储在寄存器r0-r3中。

R13:SP(堆栈指针)。堆栈指针指向堆栈的顶部。堆栈是用于函数特定存储的内存区域,当函数返回时会回收。因此,堆栈指针用于通过从堆栈指针中减去我们想要分配的值(以字节为单位)来分配堆栈上的空间。换句话说,如果我们想分配一个32位的值,我们从堆栈指针中减去4。

R14:LR(链路寄存器)。当进行函数调用时,链接寄存器会更新为一个内存地址,该地址引用函数启动的下一条指令。这样做允许程序在“子”函数完成后返回到启动“子”功能调用的“父”函数。

R15:PC(程序计数器)。程序计数器会根据执行的指令的大小自动递增。%1字节此大小在ARM状态下始终为4字节,在THUMB模式下始终为2字节。当正在执行分支指令时,PC保持目的地地址。在执行过程中,PC将当前指令的地址加8(两条ARM指令)存储在ARM状态,将当前指令加4(两条Thumb指令)的地址存储在Thumb(v1)状态。这与x86不同,在x86中,PC总是指向要执行的下一条指令。

让我们看看PC在调试器中的行为。我们使用以下程序将pc的地址存储到r0中,并包含两条随机指令。让我们看看会发生什么。

.section .text
.global _start_start:mov r0, pcmov r1, #2add r2, r1, r1bkpt

在GDB中,我们在_start处设置了一个断点并运行它:

gef> br _start
Breakpoint 1 at 0x8054
gef> run

下面是我们首先看到的输出的屏幕截图:

   我们可以看到,PC保存着将要执行的下一条指令(mov r0,PC)的地址(0x8054)。现在让我们执行下一条指令,在这之后R0应该保存PC的地址(0x8054),对吗?

 错误的,看看R0中的地址。虽然我们期望R0包含先前读取的PC值(0x8054),但它保留的值比我们先前读取的电脑(0x805c)提前两条指令。从这个例子中,你可以看到,当我们直接阅读PC时,它遵循PC指向下一条指令的定义但在调试时,PC在当前PC值(0x8054+8=0x805C)之前指向两条指令。这是因为较旧的ARM处理器总是在当前执行的指令之前获取两条指令。ARM保留此定义的原因是为了确保与早期处理器的兼容性。

状态寄存器

当您使用gdb调试ARM二进制文件时,您会看到一个名为Flags的东西:

 寄存器$cpsr显示当前程序状态寄存器(cpsr)的值,在该寄存器下,您可以看到Flags thumb、fast、interrupt、overflow、carry、zero和negative。这些标志表示CPSR寄存器中的某些位,并根据CPSR的值进行设置,并在激活时变为粗体。N、Z、C和V位与x86上EFLAG寄存器中的SF、ZF、CF和OF位相同。这些位用于支持汇编级条件和循环中的条件执行。我们将介绍第6部分:条件执行和分支中使用的条件代码。

 

 原文链接:ARM Data Types and Registers (Part 2) | Azeria Labs (azeria-labs.com)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Consistency Models终结扩散模型

最近看到一篇论文,觉得特别有意思,并且在学术界引起了不小的动静,他就是一致性模型,据说图像生成效果快、质量高,并且还可以实现零样本图像编辑,即不进行一些视觉任务训练,可以实现图像超分、修…

基于springboot+vue的论坛系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

改进YOLO系列:3.添加SOCA注意力机制

添加SOCA注意力机制 1. SOCA注意力机制论文2. SOCA注意力机制原理3. SOCA注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. SOCA注意力机制论文 暂未找到 2. SOCA注意力机制原理 3. SOCA注意力机制的配置 3.1common.py配置 ./models/common.p…

Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台

当今互联网发展迅速,应用程序的性能监控显得越来越重要。 DockerJmeterInfluxDBGrafana 是一种常用的性能监控平台,可以帮助开发者快速搭建一套可靠的监控体系。在本文中,我们将介绍如何使用这些工具搭建性能监控平台,以便开发人…

实现chatGPT 聊天样式

效果图 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Chat Example</title&g…

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值&#xff0c;找到对应的空间会出现对应的值 btree树…

CMA和CNAS是什么?两者有什么用途和区别?

CMA和CNAS是两个不同的概念&#xff0c;它们分别有着自己的用途和区别。 CMA是中国计量认证&#xff08;China Metrology Accreditation&#xff09;的缩写&#xff0c;是根据《中华人民共和国计量法》及其配套法规的规定&#xff0c;由国家质量监督检验检疫总局授权的计量认证…

HTML a标签

<a>标签定义一个超链接。它有如下主要属性&#xff1a; href&#xff1a;指定链接的地址&#xff0c;可以是一个URL、文件路径或锚点。target&#xff1a;指定链接在何处打开。其值包括&#xff1a; _blank&#xff1a;在新窗口或新标签页打开链接。_self&#xff1a;在…

Go语言基础之切片

切片 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…

事物有哪些特性 ?MySQL 如何保证事物的四大特性 ?

目录 1.事物有哪些特性 2. MySQL 如何保证事物的四大特性 3. 事物的隔离级别 1.事物有哪些特性 1.1 何为事物 &#xff1f; 事物就是把一件事情的多个步骤&#xff0c;多个操作&#xff0c;打包成一个步骤&#xff0c;一个操作。其中任意一个步骤执行失败&#xff0c;都会进…

模拟Stevens Lewis描述的小型飞机纵向动力学的非线性动态反演控制器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

毫米波雷达成像论文阅读笔记: IEEE TPAMI 2023 | CoIR: Compressive Implicit Radar

原始笔记链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486680&idx1&snedf41d4f95395d7294bc958ea68d3a68&chksmcf51be21f826373790bc6d79bcea6eb2cb3d09bb1860bba0af0fd5e60c448ca006976503e460#rd ↑ \uparrow ↑点击上述链接即…

NER(命名实体识别)的介绍与使用--附源码

概述 本文将向您简要介绍命名实体识别,这是一种用于识别文本文档中存在的实体的流行方法。本文针对 NLP 领域的初学者。在本文末尾,已经实现了预训练的 NER 模型来展示实际用例。 为什么是NER? 图1 通过观察上

cad图怎么转换成pdf格式?一招教你轻松转换

将CAD文件转换成PDF格式有很多优势。首先&#xff0c;PDF格式是一种非常流行的文件格式&#xff0c;几乎所有电脑上都可以打开。这意味着即使将PDF文件发送给其他人&#xff0c;他们也可以轻松地查看文件&#xff0c;此外&#xff0c;PDF格式可以保留CAD文件的图形和布局&#…

java请求SAP系统,发起soap的xml报文,实体类转换,idea自动生成教程

1、将接口的网页地址&#xff0c;右键保存&#xff0c;然后修改文件后缀为wsdl文件 2、idea全局搜索 wsdl&#xff0c;找到自动转换javabean插件&#xff1a; 3、点击后&#xff0c;选择下载改完后缀的文件(选择)&#xff1a; 4、将无用的class文件删除掉 5、请求sap的地址为…

CSS伪类:where和:is

CSS伪类:where和:is 1 :where1.1 概述1.2 组合与叠加1.3 优先级1.4 安全性1.5 兼容性 2 :is兼容性 1 :where 1.1 概述 :where()接受选择器列表作为它的参数&#xff0c;将会选择所有能被该选择器列表中任何一条规则选中的元素。 例如&#xff0c;在以下代码中&#xff0c;a标…

Java版 招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计tbms

​ 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以…

英文翻译照片怎么做?掌握这个方法轻松翻译

在现代社会中&#xff0c;英文已经成为了一种全球性的语言&#xff0c;因此&#xff0c;我们在阅读文章或者查看图片时&#xff0c;经常会遇到英文的内容。为了更好地理解这些英文内容&#xff0c;我们需要将其翻译成中文。在本文中&#xff0c;我将探讨图片中英文内容翻译的方…

SpringMVC 反射型跨站点脚本攻击

解决方案&#xff1a; 服务端校验&#xff0c;添加拦截器 配置web,xml <filter><filter-name>xssFilter </filter-name><filter-class>com.fh.filter.XssFilter </filter-class></filter> XssFilter package com.fh.filter;import com…

Spring Boot

前言 什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f; Spring 的诞⽣是为了简化Java 程序的开发的&#xff0c;⽽Spring Boot 的诞⽣是为了简化Spring 程序开发 的。Spring就像汽车&#xff0c;相比以前人只能其自行车走路&#xff0c;汽车可以帮助人们更快…