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

ARM基本汇编操作指令

正点原子 开发板:iMX6ULL-mini
NXP(恩智浦):SOC:IMX6ULL
ARM kernal:Cortex-A7 V7
keil 4.12 smasung:s3c2440A ARM9 V5TE

立即数

  • 能被编译器编译进指令中的数字量,称为立即数
  • 立即数是前12位(imm12),又分为imm3 + 旋转位

是立即数的判断方法:

  1. 如果一个数在0~255之间,则是立即数
  2. 如果将一个数展开为二进制形式,存在一种循环右移(偶数位)的方式,使得移位后的结果高24bit全为0,那么这个数就是立即数

四种系统栈

  • 满增栈
  • 满减栈
  • 空增栈
  • 空减栈

注:其中ARM 内核是满减栈

CPSR条件标志位(NZCV)

N:符号标志位:上条指令执行结果最高位bit31为l,则N=1,当结果作为有符号解释时为负值;
Z:零值标志位:上条指令执行结果为0(即bit0-bit3l均为0),则Z=1;
C:进位/借位标志位:进行无符号解读,如果在加法过程中进位或者减法时没有借位,则为C=1,否则C=0
V:溢出标志位:进行有符号解读,是否发生溢出-231-231-1(两个正数加得负数,两个负数加得正数)

指令

  1. mov

    mov{s}< c > < Rd >, #< const >
    mov{s}< c > < Rd >, < Rm >
    在这里插入图片描述
    示例

	mov r0,  #0x08	;0x08放入r0寄存器mov r1, r2	;将r2寄存器的值放到r1寄存器
  1. add(加法指令)
    -立即数作为第二操作数: ADD{S}< c > < Rd >, < Rn >, #< const >
    -寄存器作为第二操作数寄存器: ADD{S}< c > < Rd >, < Rn >, < Rm >{, < shift >}
    -寄存器作为第二操作数移位量: ADD{S}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
    示例:
	mov r0, #0x0fmov r1, #0x04add r2, r0, #0xf0add r3, r1, r2add r4, r2, r3, lsl #1	;将r3逻辑左移1位再和r2相加放入r4寄存器
  1. sub(减法指令)
    立即数作为第二操作数: SUB{S}< c > < Rd >, < Rn >, #< const >
    寄存器作为第二操作数寄存器: SUB{S}< c > < Rd >, < Rn >, < Rm >{, < shift >}
    寄存器作为第二操作数移位量: SUB{S}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
    示例:
	mov r0, #0xf0mov r1, #0x01sub r2, r0, #0x04sub r3, r2, r1	;r2-r1
  1. ldr(加载指令)
    ldr< c > < Rt >, < label >

  2. sdr(存放指令)

  3. mvn(按位取反移动指令)
    MVN{S}< c > < Rd >, #< const >
    MVN{S}< c > < Rd >, < Rm >{, < shift >}
    MVN{S}< c > < Rd >, < Rm >, < type > < Rs >

	mov r0, 0xffmvn r0, r0	;r0按位取反后存放在r0 
  1. bic(bit clear):指定位置清零指令
    bic{s}< c > < Rd >, < Rn >, #< const >
    bic{s}< c > < Rd >, < Rn >, < Rm >{, < shift >}
    bic{s}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
    示例:
	mov r0, #0xf1bic r1, r0, #(1 << 4)	;将r0中(1<<4)的位置清零存放到r1中
  1. orr(指定位置置1指令)
    orr{s}< c > < Rd >, < Rn >, #< const >
    orr{s}< c > < Rd >, < Rn >, < Rm >{, < shift >}
    orr{s}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
    示例:
	mvn r1, r1orr r2, r0, #(1 << 2)	;将r0中(1<<2)的位置置1的位置存放到r1中
  1. cmp(比较指令)
    cmp< c > < Rn >, #< const >
    cmp< c > < Rn >, < Rm >{, < shift >}
    cmp< c > < Rn >, < Rm >, < type > < Rs >
    示例
	cmp r0, r1 ;<==> subs r0, r1
  1. b bl bx : (跳转指令)
    b< c > < lable >
    b fun <==> ldr pc, =fun

    bl< c> < label >
    bl fun

    bx< c> < Rm>
    bx lr <==> mov pc, lr

bl和bx的区别:
bl会在执行跳转语句之前,将跳转语句的下一条语句pc值保存到 lr 中(保护现场)
bx会回复 lr 中的地址到pc (恢复现场)

  1. stmfd ldmfd:(批量数据传输的指令)
    <1>stmfd(Store Multiple Full Descending):批量存储指令,将多个寄存器的值写入内存(压栈)
    语法:stmfd 寄存器!, {寄存器列表}
    :stmfd sp!, {r0-r3, lr} //表示将 r0-r3 和 lr 的值依次压入栈中
    <2>ldmfd(Load Multiple Full Descending):批量加载指令,从内存中读取数据到多个寄存器(弹栈)
    语法:ldmfd 寄存器!, {寄存器列表}
    :ldmfd sp!, {r0-r3, pc} //表示从栈中依次读取数据到 r0-r3 和 pc 中

示例:

	b asm_main
asm_fun0mov r0, #10mov r1, #12bx lrasm_twoNumMaxmov r0, #10mov r1, #20cmp r0, r1movge r3, r0movlt r3, r1stmfd sp!, {r0-r12, lr}bl asm_fun0ldmfd sp!, {r0-r12, lr}bx lrasm_mainldr sp, =0x40001000mov r0, #100mov r1, #200stmfd sp!, {r0-r12, lr}bl asm_twoNumMaxldmfd sp!, {r0-r12, lr}add r3, r0, r1 
http://www.dtcms.com/a/394006.html

相关文章:

  • 电商搜索 API 的优化与性能提升:从瓶颈突破到体验升级
  • 使用DeepSeek辅助测试一个rust编写的postgresql协议工具包convergence
  • 【00】EPGF 架构搭建教程之 总揽篇
  • 深度剖析 vector 底层原理:从手写实现到核心技术点全解析
  • 嵌入式开发学习日志29——stm32之定时器中断
  • 通俗范畴论17.3 向量空间的对偶与双对偶
  • 表格 表头增加悬浮提示内容
  • emacs段落重排快捷键
  • 第九届人单合一模式引领论坛举行 构建AI时代的智能交互生态
  • 不用搜驱动!惠普官方工具:自动适配,坏了直接重装
  • JAVA八股文——java虚拟机栈
  • 华为MindSpeed 训练加速库:架构解析
  • Java的Stream实现对list实用操作【持续更新】
  • 【AI智能体】Dify集成 Echarts实现数据报表展示实战详解
  • 【01】EPGF 架构搭建教程之 Anaconda 安装指南
  • 深度学习周报(9.15~9.21)
  • MCP实战:使用 LangGraph 和 MCP 协议无缝集成外部工具
  • 【嵌入式总线通信协议库】
  • 06.【Linux系统编程】命令行参数(给main传参)、环境变量(概念+使用)、进程的虚拟地址空间(用户实际访问的空间)
  • esp32墨水屏天气预测学习
  • LabelImg 操作指南:提高标注速度
  • redhat7.2迁移ssh免密到麒麟v10
  • Linux基操
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘protobuf’ 问题
  • EXCEL中公式和文字混合和数字自动变成大写金额
  • Linux软件安装与项目部署
  • Config-配置中心2.0
  • Meta 开源 MobileLLM-R1 系列小参数高效模型,颠覆大模型竞赛
  • 【论文阅读】One-Minute Video Generation with Test-Time Training
  • 玄鸟12600M矿机ETC/ETHW挖矿性能解析与技术参数分析