汇编(实现C语言程序的调用)

一、ARM汇编指令

  1. mov: 将一个值或寄存器的内容移动到另一个寄存器中。这个指令可以用来赋值。

    示例:mov r0, #5 // 将立即数 5 移动到寄存器 r0

  2. add: 执行加法操作,将两个操作数相加,并将结果存储在目标寄存器中。

    示例:add r0, r1, r2 // 将 r1 和 r2 的值相加,并将结果存储在 r0 中

  3. sub: 执行减法操作,从一个寄存器的值中减去另一个寄存器的值,并将结果存储在目标寄存器中。

    示例:sub r0, r1, r2 // 计算 r1 - r2 的值,并将结果存储在 r0 中

  4. ldr: 从内存中加载数据到寄存器中。

    示例:ldr r0, [r1] // 从 r1 指向的地址加载数据到 r0 中

  5. bic: 对两个操作数执行按位清除运算,保留第一个操作数中的位,而将第二个操作数中的位清零。

    示例:bic r0, r1, r2 // 清除 r1 中与 r2 中相同的位,将结果存储在 r0 中

  6. orr: 对两个操作数执行按位或运算。

    示例:orr r0, r1, r2 // 将 r1 和 r2 的位进行按位或运算,结果存储在 r0 中

  7. cmp: 比较两个寄存器中的值,设置相应的标志位(如零标志、负标志等),但不存储结果。

    示例:cmp r0, r1 // 比较 r0 和 r1 的值

  8. stmfd: 将多个寄存器的内容存入内存,按全降序存储,通常用于保存寄存器状态。

    示例:stmfd sp!, {r0, r1, r2} // 将 r0, r1, r2 存储到栈中

  9. ldmfd: 从内存中加载多个寄存器的内容,按全升序恢复寄存器状态。

    示例:ldmfd sp!, {r0, r1, r2} // 从栈中加载 r0, r1, r2 的值

二、跳转语句

  1. b: 无条件跳转指令,跳转到指定的标签或地址。这是ARM汇编中最常用的跳转指令。

    示例:b label // 跳转到名为 label 的位置

  2. bl: 带链接的跳转,除了跳转到指定地址外,还将返回地址(下一条指令的地址)保存到链接寄存器(LR 或 r14)中。常用于子程序调用。

    示例:bl function // 跳转到 function,并将返回地址存储在 LR 中

  3. bx: 通过指定的寄存器地址跳转,并且可以根据寄存器的最低位设置处理器的状态(如进入 ARM 或 Thumb 状态)。它通常用于从子程序返回。

    示例:bx r0 // 跳转到 r0 寄存器中存储的地址

栈指针寄存器

  • SP(栈指针寄存器): SP 寄存器用于指向当前栈的顶部。栈通常用于存储局部变量、保存返回地址等。当使用 stmfd 和 ldmfd 指令时,stack pointer (SP) 寄存器可用于管理函数调用和返回。

CPSR 寄存器相关指令

  1. mrs: 从 CPSR(当前程序状态寄存器)读取数据。当需要获取当前状态或标志位时,使用此指令。

    示例:mrs r0, cpsr // 将 CPSR 的值加载到 r0 中

  2. msr: 设置 CPSR 的某些位。这可以用于改变处理器的状态或控制特权级别。

    示例:msr cpsr_c, r0 // 将 r0 的内容写入 CPSR 中的控制位

三、汇编

preserve8               ; 保留8字节对齐  
area reset, code, readonly ; 定义一个名为“reset”的只读代码区域  
code32                  ; 设定代码为32位  
entry                   ; 定义入口点  b start                 ; 跳转到 start 标签,开始程序执行  
ldr pc, =do_undifined   ; 将 do_undifined 的地址加载到程序计数器(PC),设置未定义指令处理  
ldr pc, =do_swi        ; 将 do_swi 的地址加载到 PC,设置软件中断处理  
ldr pc, =do_p_abort    ; 将 do_p_abort 的地址加载到 PC,设置预取中止处理  
ldr pc, =do_d_abort    ; 将 do_d_abort 的地址加载到 PC,设置数据中止处理  
nop                     ; 空操作,通常用于填充或延迟  
ldr pc, =do_irq        ; 将 do_irq 的地址加载到 PC,设置外部中断处理  
ldr pc, =do_fiq        ; 将 do_fiq 的地址加载到 PC,设置快速中断处理  do_fiq                  ; 快速中断处理程序  b do_fiq              ; 无限循环,等待快速中断  do_irq                  ; 外部中断处理程序  import irq_handler    ; 导入 irq_handler 函数  sub lr, lr, #4        ; 将链接寄存器(LR)减去4,以调整返回地址  stmfd sp!, {r0-r12, lr} ; 将 r0-r12 和 LR 保存到栈中,进行现场保护  bl irq_handler        ; 调用中断处理程序  ldmfd sp!, {r0-r12, pc}^ ; 恢复寄存器并返回  do_d_abort              ; 数据中止处理程序  b do_d_abort          ; 无限循环,等待数据中止  do_p_abort              ; 预取中止处理程序  b do_p_abort          ; 无限循环,等待预取中止  do_swi                  ; 软件中断处理程序  import swi_handler     ; 导入 swi_handler 函数  stmfd sp!, {r0-r12, lr} ; 保存 r0-r12 和 LR 到栈中  bl swi_handler        ;  调用软件中断处理程序  ldmfd sp!, {r0-r12, pc}^ ; 恢复寄存器的工作模式并返回do_undifined            ; 未定义指令处理程序  b do_undifined        ; 无限循环,等待未定义指令  start                   ; 程序启动点  ldr sp, =0x40001000  ; 将栈指针(SP)初始化为指定地址  mrs r0, cpsr          ; 读取当前程序状态寄存器(CPSR)  bic r0, r0, #0x1F     ; 清除 CPSR 中的模式位  orr r0, r0, #0x12    ; 设置 CPSR 进入 irq 模式  bic r0, #(1 << 7)     ; 清除 CPSR 中的 F 标志位  msr cpsr_c, r0       ; 更新 CPSR  ldr r0, =0x40001000  ; 将地址 0x40001000 加载到 r0   sub r0, r0, #1024    ; 计算栈顶地址  mov sp, r0           ; 设置栈指针 SP  mrs r0, cpsr          ; 读取当前 CPSR  bic r0, r0, #0x1F     ; 清除模式位  orr r0, r0, #0x10    ; 设置 CPSR 进入 user 模式  msr cpsr_c, r0       ; 更新 CPSR  ldr r0, =0x40001000  ; 将地址 0x40001000 加载到 r0  sub r0, r0, #2048    ; 计算新的栈顶地址  mov sp, r0           ; 设置栈指针 SP  import main           ; 导入 main 函数  b main               ; 跳转到 main 函数  asm_fn                  ; 汇编函数的标签  export asm_fn         ; 导出 asm_fn 函数  swi #7                ; 触发软件中断,调用系统服务  bx lr                 ; 返回到调用者  finished                ; 完成标签  b finished            ; 无限循环,等待程序结束  end                    ; 汇编代码的结束标志

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

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

相关文章

【Elasticsearch系列十四】Elasticsearch

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何使用 Next.js 进行服务端渲染(Server-Side Rendering, SSR)

文章目录 前言步骤 1: 创建 Next.js 应用步骤 2: 创建页面组件示例页面组件 步骤 3: 自定义 _app.js 文件步骤 4: 自定义 _document.js 文件步骤 5: 运行应用步骤 6: 构建和部署总结 前言 Next.js 本身就支持 SSR 并提供了一系列内置的方法来简化这个过程。下面将详细介绍如何使…

MySQL:事务的ACID特性隔离级别脏读、不可重复读、幻读、Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

使用Addressables+SpriteAtlas打包产生冗余

1&#xff09;使用AddressablesSpriteAtlas打包产生冗余 2&#xff09;使用SBP打AssetBundle脚本引用丢失 3&#xff09;Unity构建后处理&#xff08;IPostprocessBuildWithReport等接口&#xff09;抛出异常后&#xff0c;构建不会停止 4&#xff09;Unity 2022.3.0版本使用Oc…

谷歌论文提前揭示o1模型原理:AI大模型竞争或转向硬件

Open AI最强模型o1的护城河已经没有了&#xff1f;仅在OpenAI发布最新推理模型o1几日之后&#xff0c;海外社交平台 Reddit 上有网友发帖称谷歌Deepmind在 8 月发表的一篇论文内容与o1模型原理几乎一致&#xff0c;OpenAI的护城河不复存在。 谷歌DeepMind团队于今年8月6日发布…

svn 1.14.5

svn1.14.5包 https://download.csdn.net/download/weixin_42120669/89765533 svn1.14.5汉化包64位 https://download.csdn.net/download/weixin_42120669/89765533 1.14.2包&#xff0c;含有汉化包 https://download.csdn.net/download/weixin_42120669/89765647

我的AI工具箱Tauri版-VideoClipMixingCut视频批量混剪

本教程基于自研的AI工具箱Tauri版进行VideoClipMixingCut视频批量混剪。 VideoClipMixingCut视频批量混剪 是自研AI工具箱Tauri版中的一款强大工具&#xff0c;专为自动化视频批量混剪设计。该模块通过将预设的解说文稿与视频素材进行自动拼接生成混剪视频&#xff0c;适合需要…

数据结构 ——— 算法的时间复杂度

目录 时间复杂度的概念 时间复杂度函数式 大O的渐进表示法的概念 大O的渐进表示法 时间复杂度的概念 在计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff08;数学上的函数式&#xff09;&#xff0c;它定量描述了该算法的运行时间&#xff0c;一个算法执行所耗…

java工具安装教程

提示:先安装软件打开后关闭&#xff0c;在执行魔法操作 解压后会多个文件夹&#xff0c;从文件夹打开 要魔法哪款软件就打开对应的魔法脚本 比如&#xff1a;idea就运行idea魔法 点击打开 显示下面弹窗则成功&#xff0c;点击确定即可 打开IDEA查看&#xff1a;

Arthas thread(查看当前JVM的线程堆栈信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.2 thread&#xff08;查看当前JVM的线程堆栈信息&#xff09;举例1&#xff1a;展示[数字]线程的运行堆栈&#xff0c;命令&#xff1a;thread 线程ID举例2&#xff1a;找出当前阻塞其他线程的线程 二、命令列表 2.1 jvm相关命令 2.…

面试题高频之token无感刷新(vue3+node.js)

无感刷新的基本原理 使用刷新令牌&#xff08;refresh token&#xff09;&#xff1a; ○ 应用程序在首次登录成功后会获得一个访问令牌&#xff08;access token&#xff09;和一个刷新令牌&#xff08;refresh token&#xff09;。 ○ 访问令牌通常有较短的有效期&#xff0…

人工智能 | 基于ChatGPT开发人工智能服务平台

简介 ChatGPT 在刚问世的时候&#xff0c;其产品形态就是一个问答机器人。而基于ChatGPT的能力还可以对其做一些二次开发和拓展。比如模拟面试功能、或者智能机器人功能。 模拟面试功能包括个性化问题生成、实时反馈、多轮面试模拟、面试报告。 智能机器人功能提供24/7客服支…

Python习题 190:用类编写一个年会抽奖程序

(编码题)用 Python 的类编写一个年会抽奖程序,要求: 公司员工的名单用 Faker 来模拟构造,要求有姓名、部门(自己编写几个随机指定)、工号,名单数据类型为 pandas 的 DataFrame 类型 在抽奖项目的类中,有两个属性,一个是奖池,即要参与抽奖的员工名单,一个是获奖名单…

Python的基础知识,帮助初学者快速上手

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法、动态类型系统和强大的标准库而著称。这里介绍一些Python的基础知识&#xff0c;帮助初学者快速上手。 1. 环境搭建 安装Python&#xff1a;可以从Python的官方网站&#xff08;https://www.python.org/&…

学习之使用IDEA集成GIT

一、环境准备 1.1 配置git忽略文件 git.ignore 文件模版内容如下: # Compiled class file *.Class#Log file *.log# BlueJ file *.ctxt# Mobile Tools for Java (J2Me) *.mtj.tmp/# Package File *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar.classpath .project .settings…

SDKMAN!关联已安装JDK

查看已经安装的JDK目录 xxx:~ xxx$ /usr/libexec/java_home -V Matching Java Virtual Machines (3):17.0.6, x86_64: "Java SE 17.0.6" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home11.0.10, x86_64: "Java SE 11.0.10" /Library/Java/J…

简单接口自动化框架实现(Python+requests+pytest)

1、接口自动化流程 1.需求分析2.挑选需要做自动化测试的功能3.设计测试用例4.搭建自动化测试环境[可选]5.设计自动化测试项目的架构[可选]6.编写代码7.执行测试用例8.生成测试报告并分析结果 2、框架结构 --api -->封装请求 --scripts -->编写测试脚本…

pandoc自定义过滤器

pandoc自定义过滤器 pandoc是一个强大的文本转换工具&#xff0c;可以实现各种文本格式的互相转换。 在开发过程中常用的文档格式有rst、markdown、pdf、docx等&#xff0c;pandoc支持这些格式互转&#xff0c;但是对于一些特殊格式和排版支持不是太好&#xff0c;需要做一些…

Python基础(六)——PyEcharts数据可视化初级版

案例 【前言&#xff1a;为了巩固之前的Python基础知识&#xff08;一&#xff09;到&#xff08;五&#xff09;&#xff0c;并为后续使用Python作为数据处理的好帮手&#xff0c;我们一起来看几个例子】 使用工具&#xff1a;Echarts Echarts 是一个由百度开源的数据可视化…

2024年华为杯广东工业大学程序设计竞赛 B.你是银狼(反悔贪心)

题目链接 B 你是银狼 思路&#xff1a; 发现其实只有房间 1 1 1 有的选&#xff0c;房间 2 , 3 2,3 2,3 都没得选&#xff0c;是一定要选的。房间 2 2 2 回血有益还能房间通过数 1 1 1&#xff0c;因此我们肯定会选。而对于一系列房间 1 1 1&#xff0c;在血量允许的前…