ARM指令集(下)

A.2.5   ARM 协处理器指令
        ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现。表A-7给出全部的ARM协处理器指令。

表A-7  ARM 协处理器指令


        CDP
        协处理器数据操作指令。ARM 处理器通过CDP 指令通知ARM 协处理器执行特定的操作。该操作由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产 生未定义指令异常中断。指令格式如下:
        CDP{cond} coproc,opcodel,CRd,CRn,CRm{,opcode2}
        其中: coproc 指令操作的协处理器名。标准名为pn,n 为0~15。
        opcodel 协处理器的特定操作码。
        CRd 作为目标寄存器的协处理器寄存器。
        CRN 存放第1 个操作数的协处理器寄存器。
        CRm 存放第2 个操作数的协处理器寄存器。
        Opcode2 可选的协处理器特定操作码。
        CDP 指令举例如下:
        CDP p7,0,c0,c2,c3,0 ;协处理器7 操作,操作码为0,可选操作码为0
        CDP p6,1,c3,c4,c5 ;协处理器操作,操作码为1

        LDC
        协处理器数据读取指令。LDC 指令从某一连续的内存单元将数据读取到协处理器的寄存器中。协处理器数据的数据的传送,由协处理器来控传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:
        LDC{cond}{L} coproc,CRd,<地址>
        其中: L 可选后缀,指明是长整数传送。
        coproc 指令操作的协处理器名。标准名为pn,n 为0~15
        CRd 作为目标寄存的协处理器寄存器。
        <地址> 指定的内存地址
        LDC 指令举例如下:
        LDC p5,c2,[R2,#4];读取R2+4指向的内存单元的数据,传送到协处理器p5的c2寄存器中
        LDC p6,c2,[R1] ;读取是指向的内存单元的数据,传送到协处理器p6 的c2 寄存器中

        STC
        协处理器数据写入指令。STC 指令将协处理器的寄存器数据写入到某一连续的内存单元中。进行协处理器数据的数据传送,由协处理器来控制传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:
        STC{cond}{L} coproc,CRd,<地址>
        其中: L 可选后缀,指明是长整数传送。
        coproc 指令操作的协处理器名。标准名为pn,n 为0~15
        CRd 作为目标寄存的协处理器寄存器。
        <地址> 指定的内存地址
        STC 指令举例如下:
        STC p5,c1,[R0]
        STC p5,c1,[Ro,#-0x04]
        MCR
        ARM 寄存器到协处理器寄存器的数据传送指令。MCR 指令将ARM 处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:
        MCR{cond} coproc,opcodel,Rd,CRn,CRm{,opcode2}
        其中:coproc 指令操作的协处理器名。标准名为pn,n 为0~15。
        cpcodel 协处理器的特定操作码。
        CRD 作为目标寄存器的协处理器寄存器。
        CRn 存放第1 个操作数的协处理器寄存器
        CRm 存放第2 个操作数的协处理器寄存器。
        Opcode2 可选的协处理器特定操作码。
        MCR 指令举例如下:
        MCR p6,2,R7,c1,c2,
        MCR P7,0,R1,c3,c2,1,

        MRC
        协处理器寄存器到ARM 寄存器到的数据传送指令。MRC 指令将协处理器寄存器中的数据传送到ARM 处理器的寄存器中。若协处理器不能成功地执行该操作。将产生未定义异常中断。指令格式如下:
        MRC {cond} coproc,opcodel,Rd,CRn,CRm{,opcode2}
        其中:coproc 指令操作的协处理器名。标准名为pn,n为0~15。
        opcodel 协处理器的特定操作码。
        CRd 作为目标寄存器的协处理器寄存器。
        CRn 存放第1 个操作数的协处理器寄存器。
        CRm 存放第2 个操作数的协处理器寄存器。
        opcode2 可选的协处理器特定操作码。
        MRC 指令举例如下:
        MRC p5,2,R2,c3,c2
        MRC p7,0,R0,c1,c2,1

A.2.6   ARM 杂项指令
        表A-8给出全部的ARM协处理器指令。

表A-8 ARM杂项指令


        SWI
        软中断指令。SWI 指令用于产生软中断,从而实现在用户模式变换到管理模式,CPSR保存到管理模式的SPSR 中,执行转移到SWI 向量,在其它模式下也可使用SWI 指令,处理同样地切换到管理模式。指令格式如下:
        SWI{cond} immed_24
        其中:immed_24 24 位立即数,值为0~16777215 之间的整数。
        SWI 指令举例如下:
        SWI 0 ;软中断,中断立即数为0
        SWI 0x123456 ;软中断,中断立即数为0x123456
        使用SWI 指令时,通常使用以下两种方法进行传递参数,SWI 异常中断处理程序就可以提供相关的服务,这两种方法均是用户软件协定。SWI 异常中断处理程序要通过读取引起软中断的SWI 指令,以取得24 位立即数。
        (A)指令24 位的立即数指定了用户请求的服务类型,参数通过用寄存器传递。
        MOV R0,#34     ;设置了功能号为34
        SWI 12         ;调用12 号软中断
        (B)指令中的24 位立即数被忽略,用户请求的服务类型由寄存器R0 的值决定,参数通过其它的通用寄存器传递。
        MOV R0,#12     ;调用12 号软中断
        MOV R1,#34     ;设置子功能号为34
        SWI 0        ;
        在SWI 异常中断处理程序中,取出SWI 立即数的步骤为:首先确定引起软中断的SWI指令是ARM 指令还时Thumb 指令,这可通过对SPSR 访问得到:然后要取得该SWI 指令的地址,这可通过访问LR 寄存器得到:接着读出指令,分解出立即数。
        读出SWI 立即数:
        T_bit EQU 0x20
        SWI_Hander
        STMFD SP!,{R0_R3,R12,LR}         ;现场保护
        MRS R0,SPSR                     ;读取SPSR
        STMFD SP!,{R0}                     ;保存SPSR
        TST R0,#T_bit                     ;测试T 标志位
        LDRNEH R0,[LR,#-2]                 ;若是Thumb 指令,读取指令码(16 位)
        BICNE R0,R0,#0xFF00             ;取得Thumb 指令的8 位立即数
        LDREQ R0,[LR,#-4]                 ;若是ARM 指令,读取指令码(32 位)
        BICNQ R0,R0,#0xFF00000             ;取得ARM 指令的24 位立即数
        …
        LDMFD SP!,{R0-R3,R12,PC}^ ;SWI 异常中断返回

        MRS
        读状态寄存器指令。在ARM 处理器中,只有MRS 指令可以状态寄存器CPSR 或SPSR读出到通用寄存器中。指令格式如下:
        MRS{cond} Rd ,psr
        其中: Rd 目标寄存器。Rd 不允许为R15。
        psr CPSR 或SPSR
        MRS指令举例如下:
        MRS R1,CPSR     ;将CPSR 状态寄存器读取,保存到R1 中
        MRS R2,SPSR     ;将SPSR 状态寄存器读取,保存到R2 中
        MRS 指令读取CPSR,可用来判断ALU 的状态标志,或IRQ、FIQ 中断是否允许等;在异常处理程序中,读SPSR 可知道进行异常前的处理器状态等。MRS 与MSR 配合使用,实现CPSR 或SPSR 寄存器的读—修改---写操作,可用来进行处理器模式切换(),允许/禁止IRQ/FIQ 中断等设置。另外,进程切换或允许异常中断嵌套时,也需要使用MRS 指令读取SPSR 状态值。保存起来。
        使能IRQ 中断例程:
        ENABLE_IRQ
        MRS R0,CPSR
        BIC R0。R0,#0x80
        MSR CPSR_c,R0
        MOV PC,LR
        禁能IRQ 中断例程:
        DISABLE_IRQ
        MRS R0,CPSR
        ORR R0,R0,#0x80
        MSR CPSR_c,R0
        MOV PC,LR

        MSR
        写状态寄存器指令。在ARM 处理器中。只有MSR 指令可以直接设置状态寄存器CPSR或SPSR。指令格式如下:
        MSR{cond} psr_fields,#immed_8r
        MSR{cond} psr_fields,Rm
        其中: psr CPSR 或SPSR
        fields 指定传送的区域。Fields 可以是以下的一种或多种(字母必须为小写):
        c 控制域屏蔽字节(psr[7…0])
        x 扩展域屏蔽字节(psr[15…8])
        s 状态域屏蔽字节(psr[23。…16])
        f 标志域屏蔽字节(psr[31…24])
        immed_8r 要传送到状态寄存器指定域的立即数,8 位。
        Rm 要传送到状态寄存器指定域的数据的源寄存器。
        MSR 指令举例如下:
        MSR CPSR_c,#0xD3 ;CPSR[7…0]=0xD3,即切换到管理模式。
        MSR CPSR_cxsf,R3 ;CPSR=R3
        只有在特权模式下才能修改状态寄存器。
        程序中不能通过MSR 指令直接修改CPSR 中的T 控制位来实现ARM 状态/Thumb 状态的切换,必须使用BX 指令完成处理器状态的切换(因为BX 指令属转移指令,它会打断流水线状态,实现处理器状态切换)。MRS 与MSR 配合使用,实现CPSR 或SPSR 寄存器的读-修改-写操作,可用来进行处理器模式切换、允许/禁止IRQ/FIQ 中断等设置。
        堆栈指令实始化例程:
        INITSTACK
        MOV R0,LR ;保存返回地址
        ;设置管理模式堆栈
        MSR CPSR_c,#0xD3
        LDR SP,StackSvc
                       ;设置中断模式堆栈
        MSR CPSR_c,#0xD2
        LDR SP,StackIrq
        …

A.2.7   ARM 伪指令
        ARM 伪指令不是ARM 指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其它ARM 指令一样使用,但在编译时这些指令将被等效的ARM 指令代替。ARM 伪指令有四条,分别为ADR 伪指令、ADRL 伪指令、LDR 伪指令和NOP 伪指令。
        ADR
        小范围的地址读取伪指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。在汇编编译源程序时,ADR 伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD 指令或SUB 指令来实现该ADR 伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
        ADR 伪指令格式如下:
        ADR{cond} register,exper
        其中:register 加载的目标寄存器。
        exper 地址表达式。当地址值是非字地齐时,取值范围-255~255 字节之间;当地址是字对齐时,取值范围-1020~1020 字节之间。
        对于基于PC 相对偏移的地址值时,给定范围是相对当前指令地址后两个字处(因为ARM7TDMI 为三级流水线)。
        ADR 伪指令举例如下:
        LOOP MOV R1, #0xF0
        …
        ADR R2, LOOP         ;将LOOP 的地址放入R2
        ADR R3, LOOP+4
        可以用ADR 加载地址,实现查表:
        …
        ADR R0,DISP_TAB     ;加载转换表地址
        LDRB R1,[R0,R2]     ;使用R2 作为参数,进行查表
        …
        DISP_TAB
        DCB 0Xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90

        ADRL
        中等范围的地址读取伪指令。ADRL 指令将基于PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR 伪指令可以读取更大范围的地址。在汇编编译源程序时,ADRL 伪指令被编译器替换成两个条合适的指令。若不能用两条指令实现ADRL 伪指令功能,则产生错误,编译失败。ADRL 伪指令格式如下:
        ADR{cond} register,exper
        其中:register 加载的目标寄存器。
        expr 地址表达式。当地址值是非字对齐时,取范围-64K~64K 字节之间;当地址值是字对齐时,取值范围-256K~256K 字节之间。
        ADRL 伪指令举例如下:
        ADRL R0,DATA_BUF
        …
        ADRL R1 DATA_BUF+80
        …
        DATA_BUF
        SPACE 100     ;定义100 字节缓冲区
        可以且用ADRL 加载地址,实现程序跳转,中等范围地址的加载:
        …
        ADR LR,RETURNI             ;设置返回地址
        ADRL R1 Thumb_Sub+1        ;取得了Thumb 子程序入口地址,且R1 的0 位置1
        BX R1                     ;调用Thumb 子程序,并切换处理器状态
        RETURNI
        …
        CODE16
        Thumb_Sub
        MOV R1,#10
        …

        LDR
        大范围的地址读取伪指令。LDR 伪指令用于加载32 位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR 伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV 或MVN 的范围,则使用MOV 或MVN 指令代替该LDR 伪指令,否则汇编器将常量放入字池,并使用一条程序相对偏移的LDR 指令从文字池读出常量。LDR 伪指令格式如下:
        LDR{cond} register,=expr/label_expr
        其中:register 加载的目标寄存器
        expr 32 位立即数。
        label_expr 基于PC 的地址表达式或外部表达式。
        LADR 伪指令举例如下:。
        LDR R0,=0x123456         ;加载32 位立即数0x12345678
        LDR R0,=DATA_BUF+60     ;加载DATA_BUF 地址+60
        …
        LTORG                     ;声明文字池
        伪指令LDR 常用于加载芯片外围功能部件的寄存器地址(32 位立即数),以实现各种控制操作加载32 位立即数:
        …
        LDR R0,=IOPIN ;加载GPIO 寄存器IOPIN 的地址
        LDR R1,[R0] ;读取IOPIN 寄存器的值
        …
        LDR R0,=IOSET
        LDR R1,=0x00500500
        STR R1,[R0] ;IOSET=0x00500500
        …
        从PC 到文字池的偏移量必须小于4KB。与ARM 指令的LDR 相比,伪指令的LDR 的参数有“=”号

        NOP
        空操作伪指令。NOP 伪指令在汇编时将会被代替成ARM 中的空操作,比如可能为“MOV  R0, R0”指令等,NOP 伪指令格式如下:
        NOP
        NOP
        NOP
        NOP
        SUBS R1, R1, #1
        BNE DELAY1
        …

转载于:https://www.cnblogs.com/getyoulove/p/3672034.html

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

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

相关文章

LeetCode283——Move Zeroes(将0移动到数组最后面)

题目&#xff1a; 解法&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {fill(remove(nums.begin(), nums.end(),0), nums.end(), 0);} }; oh&#xff0c;no&#xff01;解法二&#xff1a; void moveZeroes(vector<int>& nums)…

java关闭一个窗口打开另一个_推开中式门窗,就像打开了另一个写意的世界…...

导语“湖光秋枕上&#xff0c;岳翠夏窗中。”在传承几千年的中式建筑文化中&#xff0c;自古以来就有多门窗、少实墙的传统&#xff0c;虚虚实实之间讲究内外空间融合&#xff0c;借景框景之时彰显人与自然和谐&#xff0c;门窗甚至直接决定着整体建筑的风格气质。随着时代的不…

同样是面对失败的责任:任春雷比杜一楠更有种

24 券创始人杜一楠最近成为热点人物&#xff0c;他的一篇“悔过书”引发各大媒体上万次的转载。一夜之间&#xff0c;这位与资方博弈的爷们儿却变成了一个负面人物&#xff0c;让人始料不及。业界人士评价说&#xff0c;这份“失败总结”满篇都是假大空&#xff0c;所总结的六点…

PopStar(消灭星星)游戏源代码下载、分析及跨平台移植---第四篇(关卡)

背景&#xff1a;本来打算把第三篇和第四篇合并都一起&#xff0c;但以前计划分开&#xff0c;就还是分来吧&#xff1b;一般的游戏涉及到关卡的话&#xff0c;一般都会建立一个数组来存放各种定义参数&#xff0c;消灭星星关卡比较容易&#xff0c;不需要建立数组&#xff0c;…

LeetCode344——Reverse String(将字符串反转)

题目&#xff1a; 解法&#xff1a; class Solution { public:string reverseString(string s) {int i0,js.size()-1;while(i<j){swap(s[i],s[j--]);}return s; } };

Thinkphp带表情的评论回复实例

Thinkphp带表情的评论回复实例 基于Thinkphp开发的一个简单的带表情的评论回复实例&#xff0c;可以无限回复&#xff0c;适合新手学习或作为毕业设计作品等。 评论提交验证 1 $(".submit-btn").click(function() { 2 var $this $(this); 3 var name $th…

amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...

Hello&#xff0c;各位头条的读者大家好&#xff01;接下来一段时间小编将和大家一起学习Java&#xff0c;“我们一起学Java”专题将会持续更新&#xff0c;欢迎大家关注。这里是“我们一起学Java”的第二篇&#xff0c;本文主要内容&#xff1a;1.JDK、JRE、JVM的简单介绍2.JD…

让Microsoft Web Application Stress Tool 支持非80端口的站点测试

刚在做内网内某个项目的性能测试 项目部署的端口为4000 然后用Microsoft Web Application Stress Tool 测试 发现居然不支持非80端口 找遍整个配置界面没发现port选项 寻思着会不会是写到配置文件里呢 于是打开安装目录寻找 苍天不负有心人 居然找到了WAS.mdb 这个文件 停掉web…

LeetCode20——Valid Parentheses(括号匹配问题,使用栈的知识)

题目&#xff1a; 解法&#xff1a; #include <stack>class Solution { public:bool isValid(string s) {stack<char> paren;for (char& c : s) {switch (c) {case (: case {: case [: paren.push(c);break;case ): if (paren.empty() || paren.top()!() retur…

取周一时间_周一到周五不好化妆?别着急,5款夏日通勤裸妆的教程来了!

化妆已经成为了许多女生每天的必修课&#xff0c;好的妆容不仅可以让自己显得有精神还可以增添自己的自信。但是每天早上起来&#xff0c;能够化妆的时间又不多&#xff0c;所以只好每天都重复同一样妆容&#xff0c;快速便捷&#xff0c;时间久了就渐渐感觉了无生趣。尤其是周…

LeetCode22——Generate Parentheses(给定n对括号,然后看有多少正确的括号组合)

题目&#xff1a; 解法&#xff1a; The idea is intuitive. Use two integers to count the remaining left parenthesis (n) and the right parenthesis (m) to be added. At each function call add a left parenthesis if n >0 and add a right parenthesis if m>0.…

docker安装mysql_Docker 安装 MySQL

本篇将介绍如何使用 Docker 部署 MySQL 数据库及远程访问配置。安装 MySQL拉取镜像使用下面的命令拉取 MySQL 数据库的镜像&#xff1a;$ sudo docker pull mysql # 拉取最新版本的镜像&#xff0c;当前为 MySQL 8 版本&#xff0c;tag 为 latest$ sudo docker pull mysql:5.7…

LeetCode17——Letter Combinations of a Phone Number(手机几个按键对应的字母(符号)组合)

题目&#xff1a; 解法&#xff1a; Simple and efficient iterative solution. Explanation with sample input "123" Initial state: result {""} Stage 1 for number "1": result has {""}candiate is "abc"generate …

python人人语音爬虫(登陆尚未完成,需要使用先登录在查cookie中的t)

2019独角兽企业重金招聘Python工程师标准>>> import urllib, urllib2, cookielib,re,jsondef LoginRenren(url,t_cookie):cookie {"t": t_cookie}#cookie中的t需要到浏览器中去查cookie "".join(x "" cookie[x] ";" f…

IDEA将项目打包为指定class文件的jar

转自&#xff1a;https://blog.csdn.net/makang456/article/details/86699375 【背景】 公司最近要和某大公司合作&#xff0c;将本公司的产品提供给其它公司单独部署售卖&#xff0c;为了让产品中重要的服务具备防君子不防小人的作用&#xff0c;于是就写了一个单独的服务…

鼠标点击实现花瓣雨_每周实验 | 黄金雨

点击BNU化学学社快来关注我们吧&#xff01;倩西风染就丹砂。不比黄金雨&#xff0c;灿余霞。送幽梦&#xff0c;到仙家。背景介绍BACKGROUND在开始实验之前&#xff0c;我们先来看一种植物&#xff0c;阿勃勒。它是苏木科决明属的落叶大乔木&#xff0c;花朵是最重要的观赏特征…

大规模天线阵列(massive-mimo)的介绍

本文转载于http://www.sohu.com/a/106043955_114877&#xff0c;如有侵权&#xff0c;请告知删除。有删改。 前言 这是最好的时代&#xff0c;也是最坏的时代。 生活在科技大爆发的时代里&#xff0c;你是否感觉到一丝庆幸? 虚拟现实、自动驾驶&#xff0c;无数令人血脉偾张…

天文学中常用的坐标系

四种常用的坐标系 1、地平坐标系 简而言之&#xff0c;在地球圈上&#xff0c;观测者所在的点的切面和天球相交&#xff0c;得到的交线圈为地平圈。地心和观测者所在点的连线和天球的交点为天顶&#xff0c;反向延长线与天球的交点为天底。 通过北天极和天顶的经圈和地平圈有两…

lightswitch 添加 TreeView 控件

代码片段 <UserControl xmlns:sdk"http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class"LightSwitchApplication.TreeViewControl.DepartmentTreeViewControl"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presenta…

web服务器的简单实现——HTTP权威指南读书心得(七)

我又回来做笔记了~最近懒死了&#xff0c;书虽然看完了&#xff0c;但是一直懒得动笔&#xff0c;这样不行啊&#xff08;﹃&#xff09;口水。还有在这里吐槽下&#xff0c;在围观这本书的时候&#xff0c;一直有一种奇怪的感觉&#xff1a;里面说的有些东西与时代脱节啊.....…