Keil汇编相关知识

一、汇编的组成

1.汇编指令:在内存中占用内存,执行一条汇编指令会让处理器进行相关运算

分类:数据处理指令,跳转指令,内存读写指令,状态寄存器传送指令,软中断产生指令,协助处理器指令

2.伪操作:不是汇编指令,不占用指令周期,起到声明作用

3.伪指令:不是汇编指令,占用指令内存,当执行伪指令会让处理器进行对应的运算操作,通常伪指令是一条或多条汇编指令的另外一种用法

4.注释:

单行注释:@,其他架构汇编注释可能是;
多行注释:/**/
条件编译:
.if 逻辑值
代码段
.else
代码段
.endif

二、汇编指令的基本格式

<opcode>{<cond>}{s}        <Rd>,        <Rn>,        <shifter_operand>
<opcode>:汇编指令的指令码,由指令码决定现在是哪一个指令
cond:条件码,可以有可无,执行指令前先判断,满足才执行指令
s:指令码后加s,表示指令的运算结果会影响到CPSR寄存器的条件位
Rd:目标寄存器,指令运算结果会保存在目标寄存器中
Rn:第一操作寄存器,只能写寄存器,参与运算的第一个数值
shifter_operand:第二操作数,可以是寄存器,也可以是一个立即数
运算解释:先判断条件码对应条件是否满足,如满足则将第一操作数与第二操作数按指令码进行运算,运算的结果保存在目标寄存器中,并且结果影响CPSR条件位

三、数据搬移指令

1.mov{条件码} 目标寄存器,操作数vn
条件码可有可无,当存在条件码时,需满足条件才能1将操作数的数值搬移到目标寄存器
2.mvn{条件码} 目标寄存器,操作数
将操作数按位取反后的结果搬移到目标寄存器中
3.立即数
能够当作指令的一部分直接去执行的数据,操作数在当作指令的一部分执行时,需要对该操作数进行处理并保存到指令空间的[11:0]位中,如果处理完毕能够保存进去,说明该操作数是立即数。
处理方式:对该操作数进行循环右移偶数位,如果右移过程中,该操作数右移的值有在0-255这个范围内,说明该操作数是一个立即数,此时将循环右移的值保存在指令空间的[7:0]位,循环右移的偶数位数除以2的值保存到指令空间的[11:8]中(快速判断是否立即数:起始位为1和结束位为1之间的位数要小于7是立即数),当循环右移始终得不到0-255的数据,此时将其取反,如果取反值在0-255之间,该数据也是立即数
4.如果要将一个非立即数保存到寄存器中,可以使用伪指令LDR

四、数据移位指令

算术右移:除了最高符号位不变,最低位移出,最高位补0
逻辑右移:lsr{条件码},目标寄存器,第一操作寄存器,第二操作数
        最低位移出,最高位补0,将第一操作寄存器的数值右移第二操作数对应的位数
循环右移:ror{条件码},目标寄存器,第一操作寄存器,第二操作数
        最低位移出,补到最高位,将第一操作寄存器的数值循环右移第二操作数对应的位数
逻辑左移:lsl{条件码},目标寄存器,第一操作寄存器,第二操作数
        将第一操作寄存器的数值左移第二操作数对应的位数
在书写操作数时可以使用c风格移位运算:如:mov r1,#(oxff>>4);

五、位运算指令

与:与0置0,与1不变
and{条件码},目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器和第二操作数进行按位与操作,结果保存到目标寄存器中

或:或1置1,或0不变
orr{条件码},目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器和第二操作数进行按位或操作,结果保存到目标寄存器中

异或:相同为0,相异为1
eor{条件码},目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器和第二操作数进行按位异或操作,结果保存到目标寄存器中

按位取反
mvn{条件码},目标寄存器,操作数
将操作数进行按位取反操作,结果保存到目标寄存器中

按位清0:想要运算结果为0,则给一个运算数据1
bic{条件码},目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器和第二操作数进行按位清零操作,结果保存到目标寄存器中

六、算数运算指令
1.加法指令:
        add{条件码}{s}目标寄存器,第一操作寄存器,第二操作数
        将第一操作数寄存器的值加第二操作数,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位
        adc{条件码}{s}目标寄存器,第一操作寄存器,第二操作数
         将第一操作数寄存器的值加第二操作数再加上CPSR的c位值,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位
2.减法指令:
        sub{条件码}{s}目标寄存器,第一操作寄存器,第二操作数
        将第一操作数寄存器的值减去第二操作数,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位
        sbc{条件码}{s}目标寄存器,第一操作寄存器,第二操作数
         将第一操作数寄存器的值减去第二操作数再减去CPSR的c位值取反,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位
3.乘法指令:mul{条件码}{s}目标寄存器,第一操作寄存器,第二操作数
        将第一操作数寄存器的值乘以第二操作数,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位
4.在32位的处理器上进行64位的数据运算:将64位数据保存两个寄存器中,先运算低32位,运算结果影响CPSR位,后运行高32位考虑CPSR位
七、比较指令

cmp 第一操作寄存器,第二操作数
        进行两个数的比较,比较指令的本质时两个数的减法运算,运算结果影响CPSR条件位,一般比较指令会和条件码一起使用,先通过比较指令产生条件,后面的指令加上条件码,判断条件码对应的条件是否满足

八、跳转指令

1.修改PC值实现跳转,如果修改的的PC值不是4的倍数,处理器会将这个数值的最低两位设置为0,凑成4的整数倍
2.跳转指令
        b label:程序跳转到标签lable位置去执行,只能实现跳转,LR寄存器不保存返回地址
        bl label:程序跳转到标签label位置去执行,LR寄存器保存返回地址

九、内存读写指令
Keil调试过程中内存的查看
1.查看读写权限范围

2.查看内存内容

3.单寄存器内存读写指令
将一个寄存器的值写入内存中或者从内存中读取数值放在寄存器中
        向内存中写入:
        1)str 目标寄存器,[目标地址],将目标目标寄存器的4字节数据保存到目标地址对应的内存空间
        2)strh 目标寄存器,[目标地址],将目标目标寄存器的2字节数据保存到目标地址对应的内存空间
        3)  strb 目标寄存器,[目标地址],将目标目标寄存器的1字节数据保存到目标地址对应的内存空间
        从内存中读:
        1)ldr 目标寄存器,[目标地址],从目标地址对应空间的空间中,读取4字节数据保存到寄存器中
        2)ldrh 目标寄存器,[目标地址],从目标地址对应空间的空间中,读取2字节数据保存到寄存器中
        3)   ldrb 目标寄存器,[目标地址],从目标地址对应空间的空间中,读取1字节数据保存到寄存器中
        单寄存器内存操作过程中的地址偏移:
        1)    str 目标寄存器,[基地址,偏移量],将目标目标寄存器的4字节数据保存到基地址+偏移量为首地址对应的内存空间
        2)  ldr 目标寄存器,[基地址,偏移量],从基地址+偏移量为首地址的内存中读取数据保存到目标寄存器
4.批量寄存器内存读写
通过指令将多个寄存器中的数据写入到内存或者从内存中读取多个数据保存到多个寄存器
        写入到内存:
        1) stm 目标地址,{寄存器列表},将寄存器列表中的每一个寄存器的值写入到目标地址对应的内存空间
        从内存中读取:
        1) ldm 目标地址,{寄存器列表},从目标地址对应的内存空间中读取多个数据保存到寄存器列表中的每一个寄存器中
        注意:
        寄存器列表书写模式可以使用“,”分割每个寄存器
        如果寄存器编号是连续的,可以使用“-”连接头尾
        无论寄存器列表的寄存器顺序是如何,始终都是小编号的寄存器对应低地址
        批量寄存器的地址增长:
        在操作多个寄存器时,只有一个寄存器保存操作的地址,正常情况下,操作完地址之后,保存操作地址寄存器里的地址要发生相应的增长,防止多次内存读写时,内存数据发生覆盖
 写入到内存:
        1) stm 目标地址!,{寄存器列表},将寄存器列表中的每一个寄存器的值写入到目标地址对应的内存空间,同时操作目标地址会改变
        从内存中读取:
        1) ldm 目标地址!,{寄存器列表},从目标地址对应的内存空间中读取多个数据保存到寄存器列表中的每一个寄存器中,同时操作目标地址会改变
        指令不同后缀可让地址进行不同方向增长:
        1)ia:先操作目标地址,再保存目标地址的寄存器的往地址大的方向增长
        2)ib:先将保存目标地址的寄存器的往地址大的方向增长,再操作目标地址
        3)da:先操作目标地址,再保存目标地址的寄存器的往地址小的方向增长
        4)db:先将保存目标地址的寄存器的往地址小的方向增长,再操作目标地址

十、栈内存读写
        栈是一段内存,是分配出来用于保存一些临时数据,通过SP栈指针寄存器保存栈顶地址
        栈的分类:
        增栈:压栈时,SP值往高地址方向增长
        减栈:压栈时,SP值往地址低方向增长
        空栈:压栈结束,栈指针寄存器对应的栈空间没有有效数据
        满栈:压栈结束,栈指针寄存器对应的栈空间有有效数据
        根据两种不同标准相互结合,分为:满增栈(FA),满减栈(FD),空增栈(EA),空减栈(ED)
        ARM处理器操作内存时默认使用满减栈
        满减栈的压栈与出栈
        压栈:
        push{寄存器列表},将寄存器列表中每一个寄存器的值压栈
        stmdb {寄存器列表}
        stmfd {寄存器列表}
        出栈:
        pop{寄存器列表},从栈内弹出数据保存到寄存器列表的每一个寄存器中
        ldmia {寄存器列表}
        ldmfd {寄存器列表}

十一、状态寄存器传送指令

状态寄存器CPSR保存程序相关状态,通过状态寄存器指令可读取状态寄存器的值或修改CPSR的值改变程序工作状态
        读状态寄存器
        MRS 目标寄存器,CPSR,将CPSR的数值读取到目标寄存器中
        修改CPSR值
        MSR CPSR,操作数,将操作数的数值写入到CPSR寄存器中
注意:在特权模式下可以修改CPSR的值切换到USER模式,但是USER模式下不可以通过修改CPSR的值切换到特权模式,只有在特定移除才可以从USER切换到其他特权模式

十二、软中断产生指令

1.swi 操作数,产生一个软中断,操作数是一个12位的立即数,用于表示不同的软中断
2.异常模式与异常源
        异常模式:产生异常之后处理器进入的工作模式
        异常源:引发处理器进入异常模式的源头就是异常源
        ARM有5中异常模式,7种异常源

异常模式异常源
FIQ触发FIQ中断
IRQ触发IRQ中断
SVC复位
SVC软中断
ABORT取数据异常
ABORT取指令异常
UNDEF遇到未定义的指令

3.异常向量表
异常向量表是一段内存,这段内存一般加载在硬件程序开头,异常向量表大小是32字节,分为8等分,一份对应一个异常源。在异常向量表中存储了索引异常源对应的异常处理程序指令,当触发异常后,处理器会根据异常源的类型在异常向量表中得到异常处理程序的位置,进而执行异常。每一个异常源在异常向量表中的位置是固定的。

4、异常处理过程分析

触发异常后,处理器做了四大步三小步完成异常处理的转变工作,该工作由处理器自动完成,程序员需要做的是编写异常处理程序,修改程序异常向量表
        1)保存产生异常时的程序状态(CPSR)到对应异常的SPSR寄存器中
        2)修改CPSR的数值切换程序工作状态
                a.将程序的工作模式切换到对应对应的异常模式[4:0]
                b.根据触发的异常的优先级,将FIQ和IRQ中断禁用[7:6]
                c.处理器的工作状态切换到ARM状态[5]

        3)将程序的返回地址保存到对应异常模式的LR寄存器中

        4)修改PC的值到异常源所在异常向量表中位置

练习:使用汇编实现1-100的累加

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目菜单配置

stores/index.js import {createStore } from "vuex"; //计算高度 let height window.innerHeight;//计算分辨率 let width window.innerWidth;let activeIndex localStorage.getItem("activeIndex"); if (activeIndex null || activeIndex "&q…

基于单片机技术的按键扫描电路分析

摘 要&#xff1a; 单片机应用技术被广泛应用于各种智能控制系统中&#xff0c;是电子信息类专业学生必修的一门专业课。在单片机端口信息输入模块中&#xff0c;按键是主要元器件之一&#xff0c;笔者主要介绍矩阵键盘的电路设计及控制程序编写&#xff0c;分析了单片机端口连…

商城自动化测试实战 —— 登录+滑块验证

hello大家好&#xff0c;我是你们的小编&#xff01; 本商城测试项目采取PO模型和数据分离式架构&#xff0c;采用pytestseleniumjenkins结合的方式进行脚本编写与运行&#xff0c;项目架构如下&#xff1a; 1、创建项目名称&#xff1a;code_shopping&#xff0c;创建所需项目…

springboot是否可以代替spring

Spring Boot不能直接代替Spring&#xff0c;但它是Spring框架的一个扩展和增强&#xff0c;提供了更加便捷和高效的开发体验。以下是关于Spring Boot和Spring关系的详细解释&#xff1a; Spring框架&#xff1a; Spring是一个广泛应用的开源Java框架&#xff0c;提供了一系列模…

Linux 2-Vim使用

1 什么是vi及vim&#xff1f; vi是文本编辑器&#xff1b;vim是程序开发工具。 2 vi的几种模式 1 一般模式&#xff1a;vi <fileName> 就进入命令模式&#xff0c;可以删除或者复制粘贴 2 编辑模式&#xff1a;修改内容 3 命令行模式&#xff1a;最下面一行&#xf…

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样&#xff1f; 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力&#xff0c;具体信息如下&#xff1a; 1. **薪酬结构**&#xff1a;根据对外经济贸易大学招生就业处发布的2023届校园招…

一、安装VMware16

本篇来源&#xff1a;山海同行 本篇地址&#xff1a;https://shanhaigo.cn/courseDetail/1805875642621952000 本篇资源&#xff1a;以整理到-山海同行 一、VMware虚拟机下载 1. 官网下载 1. 打开官网 打开VMware官网地址&#xff1a;https://www.vmware.com/ 2. 选择下载产…

ctfshow sqli-labs web532--web540

web532 时间盲注 admin")闭合 import requestsurl"https://8b83d32c-8348-4393-ad72-08d00f7f6cd0.challenge.ctf.show/" flag"" i0 while True:i 1low 32high 127while low < high:mid (lowhigh)//2#payloadf"if((ascii(substr((databas…

大语言模型(LLMs)全面学习指南,初学者入门,一看就懂!

大语言模型&#xff08;LLMs&#xff09;作为人工智能&#xff08;AI&#xff09;领域的一项突破性发展&#xff0c;已经改变了自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff08;ML&#xff09;应用的面貌。这些模型&#xff0c;包括OpenAI的GPT-4o和Google的gem…

kafka(一)原理(2)组件

一、broker 1、介绍 kafka服务器的官方名字&#xff0c;一个集群由多个broker组成&#xff0c;一个broker可以容纳多个topic。 2、工作流程 3、重要参数 参数名称 描述 replica.lag.time.max.ms ISR中&#xff0c;如果Follower长时间未向Leader发送通信请求或同步数据&a…

计算机图形学笔记----矩阵

矩阵和标量的运算 ,则 矩阵与矩阵相乘 的矩阵A&#xff0c;的矩阵B。两矩阵&#xff0c;结果为的矩阵&#xff0c;第一个矩阵的列数必须和第二个矩阵的行数相同&#xff0c;否则不能相乘 &#xff0c;中的每个元素等于A的第i行所对应的矢量和B的第j列所对应的矢量进行矢量点…

【滚动哈希】2156. 查找给定哈希值的子串

本文涉及知识点 滚动哈希 LeetCode2156. 查找给定哈希值的子串 给定整数 p 和 m &#xff0c;一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算&#xff1a; hash(s, p, m) (val(s[0]) * p0 val(s[1]) * p1 … val(s[k-1]) * pk-1) mod m. 其中 val(s[…

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

《C语言》编译和链接

文章目录 一、翻译环境1、预处理2、编译3、汇编4、链接 二、运行环境 一、翻译环境 在使用编译器编写代码时&#xff0c;编写的代码是高级语言&#xff0c;机器无法直接识别和运行&#xff0c;在编译器内部会翻译成机器可执行的机器语言。 编译环境由编译和链接两大过程组成。 …

深度之眼(二十九)——神经网络基础知识(四)-循环神经网络

文章目录 一、 学习目标二、序列数据三、语言模型四、循环神经网络4.1 RNN的反向传播 五、门控循环单元-GNU5.1 候选隐藏状态 六、长短期记忆网络-LSTM七、回顾 一、 学习目标 二、序列数据 序列数据是常见的数据类型&#xff0c;前后数据通常具有关联性 三、语言模型 综合…

PyQt问题汇总(持续更新)

目录 1.抛出异常后QAppliaction自动闪退 2.Unbuntu共享文件夹自动挂载 1.抛出异常后QAppliaction自动闪退 开发阶段&#xff0c;PyQt5 QAppliaction会在遇到未捕获的异常时立即退出&#xff0c;它能够快速发现并报告错误&#xff0c;我在调用一些密码算法库的时候&#xff0…

传媒行业指哪些?需要过等保吗?

传媒&#xff0c;一个人人都接触的行业。相信大家都听过传媒&#xff0c;但具体传媒行业是指什么&#xff0c;包括哪些&#xff0c;详细很多人都不了解。这不一些人在问&#xff0c;传媒行业指哪些&#xff1f;需要过等保吗&#xff1f;这里跟我们小编一起来讨论讨论吧&#xf…

SpringMVC 域对象共享数据

文章目录 1、使用ServletAPI向request域对象共享数据2、使用ModelAndView向request域对象共享数据3、使用Model向request域对象共享数据4、使用map向request域对象共享数据5、使用ModelMap向request域对象共享数据6、Model、ModelMap、Map的关系7、向session域共享数据8、向app…

Pikachu 不安全的文件下载(Unsafe file download)概述 附漏洞利用案例

目录 获取下载链接 修改链接 重新构造链接 拓展 不安全的文件下载概述 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c;便会向后台发送一个下载请求&#xff0c;一般这个请求会包含一个需要下载的文件名称&#xff0c;后台在收到请求…

PyCharm 2024.1 版本更新亮点:智能编程,高效协作

目录 1. 前言2. 更新内容2.1 智能编码体验2.1.1 Hugging Face 文档预览2.1.2 全行代码补全 2.2 提升编辑器体验2.2.1 粘性行功能2.2.2 编辑器内代码审查 2.3 全新终端体验&#xff08;测试版&#xff09;2.3.1 新终端 Beta 2.4 智能助手&#xff08;特定版本和专业用户&#xf…