汇编相关知识

目录

如何判断某个数是立即数?

[ldr 与 str](#ldr 与 str)

[跳转指令 b 的分类与区别:b 、bl 、bx](#跳转指令 b 的分类与区别:b 、bl 、bx)

栈的分类:空增栈,空减栈,满增栈,满减栈

汇编调用C语言传参时

主调函数要干的事:

启动代码的主要任务

汇编中的置0、置1


如何判断某个数是立即数?

  1. 如果某个数的数值范围在0x00 ~ oxff之间,那么这个数是立即数
  2. 把某个数展开成二进制,这个数的最高位的1到最低位的1之间的序列位数不能超过8位
  3. 如果这个二进制序列凑够8位之后,右边必须为偶数个连续的0

ldr 与 str

ldr:

  • 功能① 向寄存器中加载一个非立即数 ldr <RD> , =<const>
  • 功能② 将RAM中的数据加载到寄存器 ldr R0 , R1,#\

str: 当寄存器中的数据写入指定的RAM中

跳转指令 b 的分类与区别:b 、bl 、bx

b : branch 无条件跳转,当函数调用时,无法将返回地址保存到LR寄存器

bl : 函数调用时,会将返回地址保存到LR寄存器

bx : 跳转到LR寄存器对应的返回地址

栈的分类:空增栈,空减栈,满增栈,满减栈

空栈:先写数据再挪动指针

满栈:先挪动指针再写数据
增栈:入栈时,SP指针向上移动

减栈:入栈时,SP指针向下移动
满减栈:*--SP,先让SP--,再写数据

汇编调用C语言传参时

如果参数少于或等于4个时,可以通过通用寄存器R0--R3进行传参,当参数超过4个时,必须通过栈进行传参(入栈保护,出栈恢复),C语言函数返回的结果保存到R0寄存器中

import 函数名引入函数

export 函数名导出函数
msr : 读取某个特殊寄存器的值到通用寄存器

mrs : 把某个特殊寄存器的值写入到通用寄存器

主调函数要干的事:

  • 入栈保护:stmde SP! , {要保护状态的寄存器名}
  • 出栈恢复:ldmfd SP! , {要保护状态的寄存器名}

启动代码的主要任务

  1. 初始化异常向量表
  2. 初始化各工作模式的栈指针寄存器
  3. 开启ARM内核的中断允许
  4. 将工作模式设置为USER模式
  5. 完成上述工作后,引导程序进入C语言主函数执行

汇编中的置0、置1

bic: 将寄存器中的值某几位清零(取决于立即数那几位是1)

orr : 将寄存器中的值某几位置一(取决于立即数那几位是1)

相关推荐
AC赳赳老秦2 小时前
数据采集全链路审计留痕:用 OpenClaw 实现合规审计与追溯
开发语言·汇编·python·php·swift·deepseek·openclaw
小雪崩2 天前
嵌入式学习 day60:ARM汇编——触摸屏与SPI
汇编·arm开发·学习
额额额对了2 天前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
AOI小白新手上路2 天前
4-3_ARM汇编_学习笔记
汇编·arm开发·学习
AC赳赳老秦3 天前
公开音频转写信息提取:OpenClaw 处理发布会与听证会文本并提取核心决策信息
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
AC赳赳老秦3 天前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw
AC赳赳老秦4 天前
公开 CSV 数据集批量处理实战:用 OpenClaw 高效完成下载、清洗与标准化分析样本生成
java·开发语言·汇编·c++·python·deepseek·openclaw
斑马13912 天前
ARM学习笔记(二)——ARM汇编基础
汇编·arm开发·arm
wechatbot88812 天前
【极客互动】企业微信Spring Boot 调度 SearchContact开发自动添加外部联系人网关
汇编·微信·自动化·企业微信·rpa
星栖与芯13 天前
LiteOS-M 切换汇编逐行图解(5):HalPendSV 任务切换的现场搬运(五阶段逐行)
汇编·stm32·嵌入式硬件·harmonyos