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

数据处理指令

@ 汇编中的符号
@ 1.指令:    能够编译生成一条32位的机器码,且能被CPU识别和执行
@ 2.伪指令:本身不是指令,编译器可以将其替换成若干条等效指令
@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译

@ ARM指令
@ 1.数据处理指令:        数学运算、逻辑运算
@ 2.跳转指令:            实现程序的跳转,本质就是修改了PC寄存器
@ 3.Load/Srore指令:    访问(读写)内存
@ 4.状态寄存器传送指令:访问(读写)CPSR寄存器
@ 5.软中断指令:        触发软中断异常
@ 6.协处理器指令:        操控协处理器的指令

@ *****************************************************************

.text                @表示当前段为代码段
.global _start        @声明_start为全局符号
_start:                @汇编程序的入口

@ 1.指令:能够编译生成一条32位的机器码,且能被CPU识别和执行

    @ 1.1 数据处理指令:数学运算、逻辑运算

一、数据处理指令总结

1. 数据搬移
指令示例说明
MOVMOV R1, #1赋值
MVNMVN R0, #0xFF按位取反后赋值
2. 运算指令格式

操作码 目标寄存器, 第一操作寄存器, 第二操作数

3. 基本运算
指令示例说明
ADDADD R1, R2, R3加法
SUBSUB R1, R2, R3减法
RSBRSB R1, R2, #3逆向减法(3 - R2)
MULMUL R1, R2, R3乘法(只能是寄存器)
4. 位运算
指令示例说明
ANDAND R1, R2, R3按位与
ORRORR R1, R2, R3按位或
EOREOR R1, R2, R3按位异或
BICBIC R1, R2, #0x0F位清零(第二操作数为掩码)
5. 移位
指令示例说明
LSLLSL R1, R2, #1逻辑左移
LSRLSR R1, R2, #1逻辑右移
6. 扩展语法
示例说明
MOV R1, R2, LSL #1移位后赋值

、标志位与后缀

  • 默认不影响标志位(N、Z、C、V)

  • S 后缀可影响标志位,如:

    • ADDSSUBS


三、64 位运算(带进位/借位)

1. 带进位加法(ADC)
ADDS R5, R1, R3   @ 低32位相加,更新标志
ADC  R6, R2, R4   @ 高32位相加,加进位
(ADC适用于多字节(如32位)加法,ADC执行后,CF(进位标志)会被更新)
2. 带借位减法(SBC)
SUBS R5, R1, R3   @ 低32位相减,更新标志
SBC  R6, R2, R4   @ 高32位相减,减借位
(用于处理超过32位的减法运算。当需要借位时,进位标志会被清零)

四、立即数

  • 包含在指令中,速度快

  • 不能是任意 32 位数,有局限性

  • 编译器可能将非法立即数替换为多条指令

MOV R1,#1 ,#1是立即数,立即数的本质是包含在指令当中的数,

这条指令,经过编译器编译后,会生成一条32位的机器码,1包含在机器码中了,当CPU执行这条MOV指令时,CPU会把这条机器码读到CPU内部,所以CPU执行这条指令时,就会把机器码中的1提取出来,放到CPU内部中的R1里面


@ 数据搬移指令

@ MOV R1, #1
@ R1 = 1
@ MOV R2, R1
@ R2 = R1

@ MVN R0, #0xFF 
@ R0 = ~0xFF

@ 立即数
@ 立即数的本质就是包含在指令当中的数,属于指令的一部分
@ 立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快
@ 立即数的缺点:不能是任意的32位的数字,有局限性
@ MOV R0, #0x12345678
@ MOV R0, #0x12

@ 编译器替换
@ MOV R0, #0xFFFFFFFF

@ 数据运算指令基本格式
@    《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
@        操作码            指示执行哪种运算
@        目标寄存器:    存储运算结果
@        第一操作寄存器:第一个参与运算的数据(只能是寄存器)
@        第二操作数:    第二个参与运算的数据(可以是寄存器或立即数)

@ 加法指令
@ MOV R2, #5
@ MOV R3, #3
@ ADD R1, R2, R3
@ R1 = R2 + R3
@ ADD R1, R2, #5
@ R1 = R2 + 5

@ 减法指令
@ SUB R1, R2, R3
@ R1 = R2 - R3
@ SUB R1, R2, #3
@ R1 = R2 - 3

@ 逆向减法指令
@ RSB R1, R2, #3
@ R1 = 3 - R2

@ 乘法指令
@ MUL R1, R2, R3
@ R1 = R2 * R3
@ 乘法指令只能是两个寄存器相乘

@ 按位与指令
@ AND R1, R2, R3
@ R1 = R2 & R3

@ 按位或指令
@ ORR R1, R2, R3
@ R1 = R2 | R3

@ 按位异或指令
@ EOR R1, R2, R3
@ R1 = R2 ^ R3

@ 左移指令
@ LSL R1, R2, R3
@ R1 = (R2 << R3)

@ 右移指令
@ LSR R1, R2, R3
@ R1 = (R2 >> R3)

@ 位清零指令
@ MOV R2, #0xFF
@ BIC R1, R2, #0x0F
@ 第二操作数中的哪一位为1,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器

@ 格式扩展
@ MOV R2, #3
@ MOV R1, R2, LSL #1
@ R1 = (R2 << 1)

@ 数据运算指令对条件位(N、Z、C、V)的影响
@ 默认情况下数据运算不会对条件位产生影响,在指令后加后缀”S“才可以影响

@ 带进位的加法指令
@ 两个64位的数据做加法运算
@ 第一个数的低32位放在R1
@ 第一个数的高32位放在R2
@ 第二个数的低32位放在R3
@ 第二个数的高32位放在R4
@ 运算结果的低32位放在R5
@ 运算结果的高32位放在R6

@ 第一个数
@ 0x00000001 FFFFFFFF
@ 第二个数
@ 0x00000002 00000005

@ MOV R1, #0xFFFFFFFF
@ MOV R2, #0x00000001
@ MOV R3, #0x00000005
@ MOV R4, #0x00000002
@ ADDS R5, R1, R3
@ ADC  R6, R2, R4
@ 本质:R6 = R2 + R4 + 'C'

@ 带借位的减法指令

@ 第一个数
@ 0x00000002 00000001
@ 第二个数
@ 0x00000001 00000005

@ MOV R1, #0x00000001
@ MOV R2, #0x00000002
@ MOV R3, #0x00000005
@ MOV R4, #0x00000001
@ SUBS R5, R1, R3
@ SBC  R6, R2, R4
@ 本质:R6 = R2 - R4 - '!C'


文章转载自:

http://RDJdVHaa.nchLk.cn
http://MEYzXEgq.nchLk.cn
http://6v1KzdDG.nchLk.cn
http://C1OnZbGN.nchLk.cn
http://10Q48uHs.nchLk.cn
http://xMZIdV4f.nchLk.cn
http://wJFtpPdS.nchLk.cn
http://VLlQiRGf.nchLk.cn
http://nmZLdXfi.nchLk.cn
http://wpB4DXEe.nchLk.cn
http://3Qejfqd7.nchLk.cn
http://cgibsrSQ.nchLk.cn
http://6XDcRsNF.nchLk.cn
http://wmacktRM.nchLk.cn
http://e7efGU2t.nchLk.cn
http://UPH7LG8N.nchLk.cn
http://rKf2JEwc.nchLk.cn
http://xGPRcY2X.nchLk.cn
http://4p6SwhvQ.nchLk.cn
http://H0QlXQJT.nchLk.cn
http://peNxqa2P.nchLk.cn
http://g6I8haRn.nchLk.cn
http://BQzcm7wq.nchLk.cn
http://rvVtYoZO.nchLk.cn
http://Y1w4j8fi.nchLk.cn
http://fH62i1iW.nchLk.cn
http://a19jiNTt.nchLk.cn
http://XGiRQs2h.nchLk.cn
http://KQFR4mmR.nchLk.cn
http://e5pjK9er.nchLk.cn
http://www.dtcms.com/a/383074.html

相关文章:

  • SpringBoot 中 ZK 与 Kafka 节点选择逻辑:底层原理与实践解析
  • 事务与mysql数据库锁的关系
  • 继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
  • 07-Redis 基础操作全攻略:从键管理到数据类型判断
  • 【linux】特殊权限
  • [数据结构] 排序
  • Python网络与多任务编程:TCP/UDP实战指南
  • Elasticsearch面试精讲 Day 17:查询性能调优实践
  • Go-zero 构建 RPC 与 API 服务全流程
  • CRI容器运行时接口
  • 《Python 自动化表单填写全攻略:从基础操作到实战案例》
  • 黑马程序员JVM基础学习笔记
  • 驰骋低代码BPM开发平台的组成部分
  • ubuntu22.04源码安装ffmpeg-4.4
  • 黑马Java进阶教程,全面剖析Java多线程编程,并发和并行,笔记02
  • 大数据毕业设计选题推荐-基于大数据的教育与职业成功关系可视化分析系统-Spark-Hadoop-Bigdata
  • Ubuntu Server 安装图形界面和通过Window远程桌面连接服务器(Xrdp)
  • 贪心算法在云计算虚拟机部署问题中的应用
  • macOS中找不到钥匙串访问
  • 基于FPGA实现LeNet-5(经典CNN识别手写数字)推理
  • 算法-双指针5.6
  • Eino Indexer 组件完全指南
  • 算法-双指针3.4
  • 【开题答辩全过程】以 “旧书驿站”微信小程序的设计与开发为例,包含答辩的问题和答案
  • Altium Designer使用精通教程 第七章(PCB输出)
  • 【秋招笔试】2025.09.13美团秋招算法岗真题\
  • LeetCode 2367.等差三元组的数目
  • 第16课:多模态Agent协作
  • 《网络攻防技术》第一章: 网络攻防概述
  • 消息语义一致性:Exactly-Once 之外的“效果等价”设计