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

汇编的使用总结

一、汇编的组成

1、汇编指令(指令集)

        数据处理指令:

                数据搬移指令

                数据移位指令

                位运算指令

                算术运算指令

                比较指令

        跳转指令

        内存读写指令

        状态寄存器传送指令

        异常产生指令等

2、伪指令

        不是汇编指令,但是可以起到指令的作用,伪指令也会占用一定内存空间

3、伪操作

        不占用指令内存,能够在程序编译过程中起到编译引导作用的内容

4、注释

二、汇编指令

2.1基本格式 

<opcode>{<cond>}{s}        <Rd>,<Rn>,<shifter_operand>

注释:

        opcode:指令的功能码,用来表示当前指令的作用

(可以写,也可以不写        

        cond:条件码

        s:表示进行运算时运算的结果会影响到CPSR条件位

  )

        Rd:目标寄存器

        Rn:第一操作寄存器

        shifter_operand:第二操作寄存器

 2.2数据搬移指令

1、mov{条件码}        目标寄存器 操作数

        将操作数搬移到目标寄存器

2、mvn{条件码}        目标寄存器 操作数

        将操作数按位取反后搬移到目标寄存器

注意:

        操作数可以是一个寄存器,也可以是一个立即数

立即数:能够经过编码之后保存到指令空间中直接当作指令一部分去执行的数据。

如果想要把一个非立即数搬移到目标寄存器,使用伪指令ldr,格式:ldr  目标寄存器,=数据

2.3数据移位指令

1、逻辑左移

        lsl{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据左移第二操作数位数,结果保存到目标寄存器

2、逻辑右移

        lsr{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据右移第二操作数位数,结果保存到目标寄存器

3、循环右移

        ror{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据循环右移第二操作数位数,结果保存到目标寄存器

2.4位运算指令 

1、与运算

        and{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行与运算,结果保存到目标寄存器

2、或运算

        orr{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行或运算,结果保存到目标寄存器

3、异或运算

        eor{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行异或运算,结果保存到目标寄存器

4、按位取反

        mvn{条件码}        目标寄存器,第一操作寄存器,第二操作数

5、按位清零

        bic{条件码}        目标寄存器,第一操作寄存器,第二操作数

                将第一操作寄存器的数据和第二操作数进行与运算,结果保存到目标寄存器

2.5算术运算

1、加法运算

         add{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器+第二操作数

2、考虑CPSR条件位的加法运算

         adc{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值

3、减法运算

         sub{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器-第二操作数

4、考虑CPSR条件位的减法运算

         sbc{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的值

5、乘法运算

         mul{条件码}{s}        目标寄存器,第一操作寄存器,第二操作数

                目标寄存器=第一操作寄存器*第二操作数

 2.6比较指令

1、cmp        第一操作寄存器,第二操作数

        将第一操作寄存器和第二操作数进行比较

2、tst        目标寄存器,#(0x1<<N)

        用来判断目标寄存器的第N位是否为0

3、teq         目标寄存器,第二操作数

        判断目标寄存器的值是否和第二操作数相等

2.7跳转指令 

1、b        标签

        跳转到指定的标签下,跳转后LR寄存器不保存程序返回地址

2、bl        标签

        跳转到指定的标签下,跳转后LR寄存器保存程序返回地址

2.8内存读写指令 

①单寄存器内存读写指令

写:

        1、str        目标寄存器,[目标地址]

                将目标寄存器中四字节数据写入到目标地址对应的内存中  

        2、strh        目标寄存器,[目标地址]

                将目标寄存器中二字节数据写入到目标地址对应的内存中

        3、strb        目标寄存器,[目标地址]

                将目标寄存器中一字节数据写入到目标地址对应的内存中

读:

        1、ldr        目标寄存器,[目标地址]

                从目标寄存器中读取四字节数据到目标地址对应的内存中  

        2、ldrh        目标寄存器,[目标地址]

                将目标寄存器中读取二字节数据到目标地址对应的内存中

        3、ldrb        目标寄存器,[目标地址]

                将目标寄存器中读取一字节数据到目标地址对应的内存中


②批量寄存器内存读写指令

写:

        1、stm        基地址,{寄存器列表}

                将寄存器列表中所有寄存器的数据写入到基地址为首地址的内存中 

读:

        1、ldm        基地址,{寄存器列表}

                从基地址开始往下读取数据,保存到寄存器列表中的每一个寄存器中

批量寄存器地址增长方式

        Ⅰ、ia后缀        先向基地址读写数据,基地址再往大地址方向增长

        Ⅱ、ib后缀       基地址先往大地址方向增长,再向基地址读写数据

        Ⅲ、da后缀         先向基地址读写数据,基地址再往小地址方向增长

        Ⅳ、da后缀        基地址先往小地址方向增长,再向基地址读写数据         


③栈内存读写

        压栈:

                push        {寄存器列表}

        出栈:

                pop        {寄存器列表}

栈的分类:

        1、空栈和满栈

        2、增栈和减栈

        组合:空增栈(EA)        空减栈(ED)        满增栈(FA)        满减栈(FD)

2.9状态寄存器传送指令

1、读状态寄存器指令

        mrs        目标寄存器,CPSR

                读取CPSR寄存器数值,保存到目标寄存器

2、修改状态寄存器

        msr        CPSR,操作数

                修改CPSR寄存器的数值为操作数

2.10软中断产生指令 

1、swi        操作数

        操作数是一个立即数,就是产生软中断的中断号

异常模式和异常源

 

相关文章:

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…...

DeepSeek理解概率的能力

问题&#xff1a; 下一个问题是概率问题。乘车时有一个人带刀子的概率是百分之一&#xff0c;两个人同时带刀子的概率是万分之一。有人认为如果他乘车时带上刀子&#xff0c;那么还有其他人带刀子的概率就是万分之一&#xff0c;他乘车就会安全得多。他的想法对吗&#xff1f;…...

AI 浪潮席卷中国年,开启科技新春新纪元

在这博主提前祝大家蛇年快乐呀&#xff01;&#xff01;&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其影响力已经渗透到社会生活的方方面面。在中国传统节日 —— 春节期间&#xff0c;AI 技术也展现出了巨大的潜力&#xff0c;为中国年带…...

AI时代的网络安全:传统技术的落寞与新机遇

AI时代的网络安全&#xff1a;传统技术的落寞与新机遇 在AI技术飞速发展的浪潮中&#xff0c;网络安全领域正经历着前所未有的变革。一方面&#xff0c;传统网络安全技术在面对新型攻击手段时逐渐显露出局限性&#xff1b;另一方面&#xff0c;AI为网络安全带来了新的机遇&…...

可以称之为“yyds”的物联网开源框架有哪几个?

有了物联网的发展&#xff0c;我们的生活似乎也变得更加“鲜活”、有趣、便捷&#xff0c;包具有科技感的。在物联网&#xff08;IoT&#xff09;领域中&#xff0c;也有许多优秀的开源框架支持设备连接、数据处理、云服务等&#xff0c;成为被用户们广泛认可的存在。以下给大家…...

线程局部存储tls的原理和使用

一、背景 tls即Thread Local Storage&#xff0c;也就是线程局部存储&#xff0c;可在进程内&#xff0c;多线程按照各个线程分开进行存储。对于一些与线程上下文相关的变量&#xff0c;可放到tls中&#xff0c;减少多线程之间的数据同步的开销。 有人可能会问&#xff0c;我…...

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…...

CAN总线

1. 数据帧&#xff08;Data Frame&#xff09; 数据帧是 CAN 总线中最常用的帧类型&#xff0c;用于传输实际的数据。其结构如下&#xff1a; 起始位&#xff08;Start of Frame, SOF&#xff09;&#xff1a;标志帧的开始。标识符&#xff08;Identifier&#xff09;&#x…...

qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)

1.简介 在 Qwen2-VL 发布后的五个月里&#xff0c;众多开发者基于该视觉语言模型开发了新的模型&#xff0c;并向 Qwen 团队提供了极具价值的反馈。在此期间&#xff0c;Qwen 团队始终致力于打造更具实用性的视觉语言模型。今天&#xff0c;Qwen 家族的最新成员——Qwen2.5-VL…...

python实现dbscan

python实现dbscan 原理 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。它将簇定义为密度相连的点的最大集合&#xff0c;能够把具有足够高密度的区域划分为簇&#xff0c;并可在噪声的空间数据库中发现任意形…...

学习数据结构(3)顺序表

1.动态顺序表的实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;扩容 &#xff08;3&#xff09;头部插入 &#xff08;4&#xff09;尾部插入 &#xff08;5&#xff09;头部删除 &#xff08;这里注意要保证有效数据个数不为0&#xff09; &#xff08;6&a…...

正在更新丨豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)

文章目录 豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)写在前面数据采集0.注意事项1.创建Scrapy项目`douban2025`2.用`PyCharm`打开项目3.创建爬虫脚本`douban.py`4.修改`items.py`的代码5.修改`pipelines.py`代码6.修改`settings.py`代码7.启动`doub…...

wx043基于springboot+vue+uniapp的智慧物流小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…...

每日一题 430. 扁平化多级双向链表

430. 扁平化多级双向链表 简单 /*class Solution { public:Node* flatten(Node* head) {Node* tail nullptr;return dfs(head);}Node* dfs(Node* head){Node* cur head;while(cur ! nullptr){if(cur->child ! nullptr){Node* curChild getTail(cur->child);Node* te…...

UE学习日志#14 GAS--ASC源码简要分析10 GC相关

注&#xff1a;1.这个分类是按照源码里的注释分类的 2.本篇是通读并给出一些注释形式的&#xff0c;并不涉及结构性的分析 3.看之前要对UE的GAS系统的定义有初步了解 4.因为都是接口函数&#xff0c;有些没细看的研究那一部分的时候会细看 1 一些接口函数&#xff0c;但是…...

使用Python和Qt6创建GUI应用程序--关于Qt的一点介绍

关于Qt的一点介绍 Qt是一个免费的开源部件工具包&#xff0c;用于创建跨平台GUI应用程序&#xff0c;允许应用程序从Windows瞄准多个平台&#xff0c;macOS&#xff0c; Linux和Android的单一代码库。但是Qt不仅仅是一个Widget工具箱和功能内置支持多媒体&#xff0c;数据库&am…...

C#@符号在string.Format方法中作用

本文详解@符号在string.Format方法中作用。...

Next.js 14 TS 中使用jwt 和 App Router 进行管理

jwt是一个很基础的工作。但是因为架构不一样&#xff0c;就算是相同的架构&#xff0c;版本不一样&#xff0c;加jwt都会有一定的差别。现在我们的项目是Next.js 14 TS 的 App Router项目&#xff08;就是没有pages那种&#xff09;&#xff0c;添加jwt的步骤&#xff1a; 1、…...

【贪心算法】洛谷P1090 合并果子 / [USACO06NOV] Fence Repair G

2025 - 01 - 21 - 第 45 篇 【洛谷】贪心算法题单 -【 贪心算法】 - 【学习笔记】 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 洛谷 P1090[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G 【贪心算法】 文章目录 洛谷 P1090[NOIP2004 提高组] 合并果子 / [USACO06…...

Windows11无法打开Windows安全中心主界面

​# 问题描述 安全中心无法打卡主界面&#xff0c;并弹出“需要使用新应用以打开此windowsdefender连接”. 解决方法 以管理员权限打开PowerShell&#xff0c;推荐使用快捷键win x打开快捷界面&#xff0c;选择Windows终端&#xff08;管理员&#xff09;&#xff0c;并在终…...

中国DevOps市场格局重塑:本土合规与全球协作的平衡艺术

中国DevOps市场格局重塑&#xff1a;本土合规与全球协作的平衡艺术 中国企业的DevOps工具链选择正面临前所未有的复杂局面 随着数字经济的深入发展&#xff0c;DevOps工具链已经从单纯的技术选型问题演变为关乎企业数字化转型成败的战略决策。在当前的宏观环境下&#xff0c;…...

新手友好:在快马平台通过可交互代码学习OpenClaw Onboard抓取基础

今天想和大家分享一个特别适合机器人领域新手的实践项目——通过InsCode(快马)平台学习OpenClaw Onboard框架的基础操作。作为一个刚接触机械臂控制的小白&#xff0c;我发现这个平台能直接把抽象的控制概念变成可交互的代码&#xff0c;学习效率提升了好几倍。 项目环境搭建零…...

字符串拆分合并

贪心算法,最长限制。 import reclass TextFilter:def __init__(self):# 字符映射规则self.char_map = {# 省略号 → 停顿…: ,, ...: ,,: ,,# 破折号 → 停顿——: ,, —: ,,# 书名号 → 直接删除《: , 》: , 〈: , 〉: ,# 其他特殊符号 → 删除*: , /: , #: ,}# 需要保留的…...

别再为YOLOv5标签格式发愁了!手把手教你从COCO128.yaml到txt标签文件的完整配置流程

YOLOv5数据标注全流程实战&#xff1a;从配置文件解析到标签文件生成 刚接触目标检测的新手开发者们&#xff0c;常常在数据准备阶段就陷入迷茫——官方文档过于简略&#xff0c;社区教程又零散不全。本文将彻底解决这个痛点&#xff0c;带你一步步完成YOLOv5数据标注全流程&am…...

软件工程小白必看:从零理解软件生命周期与常见模型

软件工程入门指南&#xff1a;从零理解开发全流程与核心模型 从生活场景看软件生命周期 想象一下建造一栋房子的过程——从最初的蓝图设计到最终交付钥匙&#xff0c;每个阶段都有明确的目标和交付物。软件开发的历程同样如此&#xff0c;我们称之为"软件生命周期"。…...

提升社区运营效率:用快马ai为openclaw网站快速生成搜索与数据看板模块

提升社区运营效率&#xff1a;用快马AI为OpenClaw网站快速生成搜索与数据看板模块 维护一个活跃的开源技术社区网站&#xff0c;比如OpenClaw中文社区&#xff0c;经常需要根据用户反馈快速迭代功能。最近我们社区就遇到了两个需求&#xff1a;一是现有的搜索功能太简单&#…...

新手友好:基于快马平台快速上手dhnvr416h-hd设备数据监控开发

新手友好&#xff1a;基于快马平台快速上手dhnvr416h-hd设备数据监控开发 最近在做一个物联网项目&#xff0c;需要对接dhnvr416h-hd设备的数据监控功能。作为刚接触这个领域的新手&#xff0c;我发现理解设备数据格式和通信流程是最关键的第一步。好在通过InsCode(快马)平台的…...

美国人形机器人发展浅析

美国人形机器人产业正从实验室研发向工业实用化与商业化加速过渡&#xff0c;主要企业&#xff08;波士顿动力、特斯拉、Figure AI等&#xff09;均已推出量产级产品&#xff0c;覆盖工业制造、军事应用等核心场景&#xff0c;技术迭代与规模化部署成为当前行业关键词。一、主要…...

手把手教你玩转双闭环MMC逆变仿真

双闭环&#xff0b;最近电平逼近调制MMC模块化多电平换流器仿真&#xff08;逆变侧&#xff09;含技术文档 MMC Matlab-Simulink 直流侧11kV 交流侧6.6kV N22 采用最近电平逼近调制NLM 环流抑制&#xff08;PIR比例积分准谐振控制&#xff09;&#xff0c;测量桥臂电感THD获得抑…...

Wangle客户端开发实战:从零开始构建高效网络应用

Wangle客户端开发实战&#xff1a;从零开始构建高效网络应用 【免费下载链接】wangle Wangle is a framework providing a set of common client/server abstractions for building services in a consistent, modular, and composable way. 项目地址: https://gitcode.com/g…...