第2章第2节 ARM7汇编语言简介

ARM《2》_ARM的GNU汇编语言 这部分笔记就会比较简陋一些,先实现功能,后面有时间再深究原理arm指令的学习很散,后续如果需要继续深入,再行学习; 阅读详情

源码请在https://github.com/ifreecoding/MbedRtos.git下载

第2节 ARM7汇编语言简介

ARM7芯片有2种汇编语言指令集,一种叫做ARM指令集,字长为32bits,另一种叫THUMB指令集,字长为16bits。这两种指令集各有优缺点,它们可以单独使用也可以混合在一起使用,在ARM7芯片上,我们将只使用ARM指令集,在后续的Cortex芯片上我们将使用THUMB指令集的改良版——THUMB2指令集。

本小节只介绍本操作系统中使用到的一些汇编语言,对它们的介绍也仅限于本操作系统使用到的部分用法,并非全面,更详细的信息请读者自行查阅附录中的参考文档2。

另外我再补充一下我观点,以前看到一些同学说在学习芯片,请教如何使用汇编语言编程,总是抠这方面的问题。我觉得如果我们学习芯片的目的只是做开发项目,那么就没有必要学习汇编语言,可以把更多的精力放在学习芯片的功能特性上。一个完备的芯片产品甚至不需要底层软件工程师了解太多的芯片硬件外设特性,有封装好的驱动库函数可以直接调用。这次如果不是编写操作系统,我对汇编语言也仅仅是了解一点。汇编语言了解一点即可,,在某些极少数情况下可能会使用到汇编语言定位问题,但这也是极少的情况。

在操作系统中我们使用了下面几条指令:

u MOV/MOVS

MOV是英文单词Move的缩写,“搬移”的意思,将数据搬移进寄存器,指令格式为:

MOV 目的寄存器, 源寄存器

MOV指令将源寄存器中的数据搬移到目的寄存器中,寄存器间数据搬移可以使用MOV指令,如:

MOV R0, R1

MOV R14, PC

意为:

R0 = R1

R14 = PC + 8

注意,ARM7有两级流水线,如果读取PC寄存器的话,就会多读取2条指令的长度,也就是8个字节,目的寄存器为PC+8。

MOVS指令与MOV指令的格式、功能是一样的,除此之外,如果目的寄存器是PC的话,MOVS会将当前模式下的SPSR写入到CPSR中。本操作系统从SVC模式返回USR模式时就需要使用MOVS指令恢复USR模式的CPSR。例如,在中断模式下有下面的指令:

MOVS PC, R14

意为:

CPSR = SPSR

PC = R14

u ADD

ADD指令顾名思义,就是英文Add“加”的意思,指令格式为:

ADD 目的寄存器, 源寄存器, 立即数

ADD指令将源寄存器中的数据和立即数相加的结果保存到目的寄存器中,执行加法操作时可以使用ADD指令,如:

ADD R14, R14, #0x40

意为:

R14 = R14 + 0x40

u SUB/SUBS

SUB是英文单词Subtract的缩写,意为“减”,指令格式为:

SUB 目的寄存器, 源寄存器, 立即数

SUB指令将源寄存器中的数据减去立即数,所得的结果存入到目的寄存器中,执行减法操作时可以使用SUB指令,如:

SUB R14, R14, #4

意为:

R14 = R14 – 4

SUBS指令中的S标志与MOVS指令中的S标志作用类似,如果目的寄存器是PC的话,SUBS会将当前模式下的SPSR写入到CPSR中。本操作系统从IRQ中断模式返回USR模式时就需要使用SUBS指令恢复USR模式的CPSR,如:

SUBS PC, R14, #4

意为:

PC = R14 – 4

CPSR = SPSR

u AND

AND指令顾名思义,就是英文And“与”操作的意思,指令格式为:

AND 目的寄存器, 源寄存器1, 源寄存器2

AND指令将源寄存器1中的数据和源寄存器2中的数据做与操作,结果存入目的寄存器中,执行与操作时可以使用AND指令,如:

AND R0, R0, R1

意为:

R0 = R0 & R1

u ORR

ORR对应的英文是Or,“或”操作的意思,指令格式为:

ORR 目的寄存器, 源寄存器1, 源寄存器2

ORR指令将源寄存器1中的数据和源寄存器2中的数据做或操作,结果存入目的寄存器中,执行或操作时可以使用ORR指令,如:

ORR R0, R0, R1

意为:

R0 = R0 | R1

u LDR

LDR是英文Load Register的缩写,“加载寄存器”的意思,将内存中的数据存入寄存器中,指令格式为下面2种格式:

LDR 目的寄存器, [源寄存器]

LDR 目的寄存器, =常量

第一种格式将源寄存器中数据指向的内存地址中的数据存入目的寄存器,第二种格式将常量值存入目的寄存器,为寄存器赋值时可以使用LDR指令,如:

LDR R14, [R0]

LDR R0, =gpstrCurTaskSpAddr

第一条指令意为:

R14 = *R0

第二条指令中gpstrCurTaskSpAddr是一个全局变量,第二条指令意为:

R0 = &gpstrCurTaskSpAddr

从上述介绍来看,LDR指令与MOV指令似乎具有相同的功能,都可以为寄存器赋值。这两条指令的部分功能确实是一样的,但它们也有各自应用的特点。要说明这两者之间的区别,我们还需要进一步了解ARM7的指令结构,以下是有关ARM7机器码的一些知识,可以了解一下,但如果你只是做软件开发则不会有太多用处,了解即可。

ARM7内核采用的是RISC精简指令集,所有的ARM指令都是32bits的,在这32bits里既包含了指令的指令码,也包含了指令需要运算的数据,以MOV指令为例,通过MOV指令的32bits可以识别出这是一个MOV指令,又可以在这32bits里找到源寄存器和目的寄存器。我们来看一下MOV指令的机器码格式:

图 6  MOV指令的机器码格式

28~31bits(cond)是条件码,就是表明这条语句里是否有大于、等于、非零等的条件判断,这4bits共有16种状态,分别为:

二进制码

指令符号

含义

二进制码

指令符号

含义

0000

EQ

相等

0001

NE

不等

0010

CS/HS

进位/无符号数大于等于

0011

CC/LO

清进位/无符号数小于

0100

MI

减/负数

0101

PL

加/正数或0

0110

VS

溢出

0111

VC

没溢出

1000

HI

无符号数大于

1001

LS

无符号数小于等于

1010

GE

有符号数大于等于

1011

LT

有符号数小于

1100

GT

有符号数大于

1101

LE

有符号数小于等于

1110

AL

任何条件

1111

-

未定义

表 1  汇编语言条件码

指令与条件码可以有多种组合,比如MOV指令可以有MOV、MOVEQ、MOVLT等多种形式。前面我们说过状态寄存器里有NZCV的状态标志,当执行一条指令时,芯片就会将这条指令的条件码与状态寄存器中的状态标志做比较,如果状态寄存器中的状态标志满足这条指令的条件码时,则执行这条语句,如果不满足则不执行这条指令。状态寄存器中的状态标志是受某些指令影响的,因此在使用有条件码的指令进行判断前,必然会有其它指令配合使用,先修改状态寄存器中的状态标志,例如:

CMP    R1, #0

BEQ    GETNEXTTASKSP

第一条指令“CMP”是一个“比较”指令,如果R1等于0,那么它就将状态寄存器中的Z置为1,表示结果为真,否则,将状态寄存器中的Z置为0,表示结果为假。第二条指令其实是一条“B”指令,是“跳转”指令,B之后的“EQ”就是条件码,从表1中可以知道,条件是“相等”时才执行。

当R1等于0时,CMP指令就将Z置为1,执行BEQ时满足条件,就执行了跳转。如果R1不等于0,CMP指令就将Z置为0,执行BEQ时不满足条件,就不执行跳转。

同理,只有当状态寄存器中的标志为相等时,MOVEQ指令才会执行,这时其功能与MOV指令相同。而MOVLT指令则是当状态寄存器中的标志为有符号数,并且处于小于状态时才会执行的MOV指令。MOV指令的条件码是AL,因此MOV指令可以不管任何条件都去执行。其它指令也可以与条件码组合使用,具体情况请查阅参附录中的参考文档2。

25bit(I)是用来区别shifer_operand域是采用立即数寻址方式还是寄存器寻址方式,该bit为0表示寄存器寻址方式,为1表示立即数寻址方式,这就涉及到了指令的寻址方式。

寻址方式的出现不是为了使指令能有多种写法,而是受指令长度限制被迫产生的产物。以MOV指令为例,如果采用立即数寻址,立即数的长度不可能超过shifer_operand域的长度(MOV指令可以采用移位的方式装下部分更长的立即数,这些不在讨论之内),因此我们就不可能使用

MOV R0, #0x12345678

这条指令。立即数#0x12345678是32bits数据,已经超过了shifer_operand域所能装下的最长12bits数据,如果把0x12345678全部被存到指令中,那么该指令中将无法存储条件码等其它指令信息,因此,这条指令在编译时就会报错。

为了解决这个问题,芯片设计人员就设计了寄存器寻址方式,在ARM7中每种模式有16个通用寄存器,2的4次方等于16,因此只需要用4bits就可以为每个寄存器分配一个编号,R0~R15寄存器分别对应0~15的编号。4bits的寄存器编号完全可以存入shifer_operand域。采用寄存器寻址时,指令先查到寄存器的编号,然后再从寄存器中取出使用的数据,这样就解决了MOV指令受指令长度的限制而无法操作长立即数的问题。

从上述描述的过程来看采用寄存器寻址方式必须先将数据放入一个寄存器中,然后才能使用MOV指令采用寄存器寻址。对比立即数寻址方式,它增加了指令的执行时间,也增加了代码,还多用了一个寄存器,但它的优点是可以操作长的数据。

除了上面这两种寻址方式外,ARM7还有多种其它寻址方式,每种寻址方式都有其自身的特点,适用不同的场景,这里不介绍了。

21~24bits(opcode)是指令码,用来表明这条指令是什么指令,例如,MOV指令的指令码是0b1101,看到0b1101,芯片就将这条指令当做MOV指令来解析。

20bit(S)就是指令中S标志的体现,该bits为0表示指令不带S,为1表示指令带S,功能见上述指令介绍。

16~19bits(SBZ)手册中没查到是什么意思,SBZ应该是should be zero的意思,对比了几条指令发现该域果然全是0,应该是保留位。

12~15bits(Rd)是指令中的目的寄存器,存放寄存器的4bits编号。

0~11bits(shifter_operand),指令的操作数。

下面我找了4条指令,将MOV指令做一个对比:

指令

机器码

指令格式

cond

00

I

opcode

S

SBZ

Rd

shifer_operand

MOV R1, #0x64

E3A01064

1110

00

1

1101

0

0000

0001

000001100100

条件码为1110适用任何条件

立即数方式

MOV的指令码

指令没有S标志

目的寄存器为R1

源操作数为立即数0x64

MOVS PC, R14

E1B0F00E

1110

00

0

1101

1

0000

1111

000000001110

条件码为1110适用任何条件

寄存器方式

MOV的指令码

指令有S标志

目的寄存器为R15

源操作数为寄存器R14

MOVLT R3, #0x1

B3A03001

1011

00

1

1101

0

0000

0011

000000000001

LT的条件码为1011

立即数方式

MOV的指令码

指令没有S标志

目的寄存器为R3

源操作数为立即数1

MOVEQ R0, R1

01A00001

0000

00

0

1101

0

0000

0000

000000000001

EQ的条件码为0000

寄存器方式

MOV的指令码

指令没有S标志

目的寄存器为R0

源操作数为寄存器R1

表 2  MOV指令汇编格式对比

LDR指令可以将32bits数据一次装入寄存器中,这里不再详细说明了,请读者自行参考文档。

u STR

STR是英文Store Register的缩写,“存储寄存器”的意思,将数据从寄存器存入内存。STR指令与LDR指令功能相反,指令格式为:

STR 源寄存器, [目的寄存器]

STR指令将源寄存器中的数据存入目的寄存器中数据所指向的内存地址,将寄存器中的数据存入内存时可以使用STR指令,如:

STR R1, [R0]

意为:

*R0 = R1

u LDM

LDM对应的英文是Load Multiple,LDM指令是LDR指令的增强版,可以将多个连续的内存数据存入一组寄存器中,这条指令在堆栈操作中经常使用,在介绍这条指令前我们先了解一下堆栈。

堆栈是分配在内存中的一部分空间,但堆和栈是2个概念,用户调用malloc等函数申请的内存就是从堆中申请的,这块内存使用完需要由用户自行释放,堆是由用户管理的。当发生函数调用时,程序会自动将父函数的寄存器存入内存,这部分内存就叫做栈,当子函数返回父函数时,程序会从栈中取出保存的寄存器数值,再恢复到寄存器中,这样就完成了一次函数调用,栈是由程序自动管理的。

栈有空满之分,栈有增减之分。根据栈指针不同的操作方式,可以将栈分为4种。栈指针指向栈顶的元素,即最后一个入栈的元素,此时栈指针指向的栈空间是用过的,是满的,这种栈叫做满(Full)栈。栈指针指向与栈顶元素相邻的下一个元素,此时栈指针指向的栈空间是没用过的,是空的,这种栈叫做空(Empty)栈。当向栈存储数据时,栈指针是向着内存地址减少的方向移动的,这种栈叫做递减(Descending)栈。当向栈存储数据时,栈指针是向着内存地址增长的方向移动的,这种栈叫做递增(Ascending)栈。综合栈的空满和增减特性,栈可以分为FD ED FA EA这4种类型,我们所使用的ARM7芯片是FD类型。


 

图 8  B指令的机器码格式

BL指令的0~23bits存放的是要跳转的相对地址,由于指令所在地址必须是4字节对齐的,因此跳转的地址最低2bits必然是0,因此BL指令0~23bits保存的是省略这最低2bits的地址,如果补全了这2bits,BL指令就可以表示26bits的跳转地址。在这26bits中需要使用1bit表示向前跳还是向后跳,那么剩下的25bits就可以表示32MByts的范围了,225=32M,因此,我们在很多文档上可以看到B跳转指令只能跳转到±32MBytes范围内的说明,就是这个原因。

上面这个BL指令要跳转的相对地址是0x2E2(BL指令0~23bits),补充2个最低位后,跳转的相对地址为0xB88,由于ARM7有2级流水线,所以跳转到的指令需要多加8个字节,BL要跳转的实际地址为0x00080398+0xB88+8=0x00080F28。

这条BL指令执行下面的操作:

LR = 0x0008039C 

PC = 0x00080F28

在操作系统中我们没有使用BL指令,就是因为我们不知道我们所调用的函数是否会超出BL指令的跳转范围,但我们可以看到编译器编译出的很多程序都是使用BL指令调用函数的,编译器之所以不怕跳转超出±32MBytes的范围,是因为编译器在编译时就知道了程序所需要跳转的范围,它会为±32MBytes之内的跳转分配BL指令,保证BL指令不会超出范围。在这里以BL指令为例,介绍一下B指令的相关知识。

u BX

BX是英文Branch and Exchange的缩写,“跳转并改变状态”的意思,BX指令除了可以实现跳转,还可以改变芯片运行的指令集,可以在ARM指令集与THUMB指令集之间切换,这里我们只使用了它的跳转功能,格式为:

BX 目的寄存器

BX指令跳转到目的寄存器中存储的地址,由于寄存器可以存放32bits数据,因此BX指令可以实现芯片全空间跳转。

u MRS

MRS是英文Move PSR to general-purpose register的缩写,“将PSR寄存器的内容保存到通用寄存器中”的意思,就是将CPSR或SPSR寄存器的内容保存到R寄存器中,格式为:

MRS R0, SPSR

意为:

R0 = SPSR

u MSR

MSR是英文Move general-purpose register to PSR的缩写,“将通用寄存器的内容保存到PSR寄存器中”的意思,就是将R寄存器的内容保存到CPSR或SPSR寄存器中,格式为:

MSR SPSR, R0

意为:

SPSR = R0

u NOP

NOP是NO Operation 的缩写,意为空指令,执行该指令时芯片什么也不做,空闲一个指令周期。

在ARM7芯片上,我们有了上述的汇编知识就足够编写操作系统了。

指令先介绍到这里,我们再来看看汇编的函数如何来写。汇编函数使用“.func”作为函数的开始,使用“.end”标志着函数的结束,例如

    .func TaskOccurSwi

TaskOccurSwi:

    SWI

    BX     R14

    .endfunc

这就是用汇编语言写的一个函数——TaskOccurSwi。

在这里我们使用的是GNU编译器,在GNU的编译器中“@”代表注释符,与C语言中的//是一样的效果,它之后的所有语句都被认为是注释,例如:

@CMP    R1, #0

这条语句不能执行,编译器根本就不会将它编译进来。

ARM系统简介 ARM系统学习笔记第一章 ARM系统简介1.1 ARM工作模式1.2 ARM寄存器1.3 ARM寻址方式1.4 ARM 指令集1.4.1 跳转指令1.4.2 数据处理指令1.4.3 程序状态寄存器访问指令1.4.4 加载/存储指令1.4.5 批量加载/存储指令 第一章 ARM系统简介 1.1 ARM工作模式 ARM有两种工作状态: 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令 第二... 阅读详情

相关推荐

ARM7的体系结构

ARM7体系结构一.存储器的字与半字1.从偶数地址开始的连续的两个字节构成一个半字。2.能被4整除的地址的连续4个字阶构成一个字ARM指令的长度刚好是一个字,Thumb指令的长度刚好是一个半字二.存储器的存储方式(半字对齐,字对齐)1.半字对齐:存放一个数据的地址如果能被二整除,则它是半字对齐。反之,则是非半字对齐。2.字对齐:存放一个数据的地址如果能被四整除,则它是字对齐。否则,它是非字对齐。三.ARM处理器状态:ARM有两种处理器状态:ARM状态,Thumb状态。1.    ARM状态:32位。处理器执

冀博 6026

ARMv7,ARM7,ARMA7有什么区别

ARMv7,ARM7,ARMA7有什么区别

XXY2083123843的博客 5867

《ARM Cortex-R 学习指南》-【第四章】-汇编语言简介

GNU Assembler 是 GNU 工具的一部分,用于将汇编语言源代码转换为二进制目标文件。该汇编器在中有详细的文档说明,您可以在线查阅这些文档。如果您的系统上已经安装了 GNU 工具,也可以在子目录中找到文档。GNU Assembler 的文档也可以在 Ubuntu 的/gcc-doc/包中获取。接下来是一个简短的描述,旨在突出 GNU Assembler 与标准 ARM 汇编语言之间的语法差异,并提供足够的信息让您能够开始使用这些工具。

baron-周贺贺-代码改变世界ctw 1984

Cortex-A53、A57、A72、A73 、ARM7,ARM9,Cortex-M3,Cortex-M4,Cortex-A8的区别

Cortex-M内核M0,M0+,M3,M4,M7之间的区别 图片来自于www.stmcu.com.cn high-performance 高性能 Mainstream 主流 Ultra-low-power 低功耗 知识补贴: 之所以ARM公司会把Cortex-M分为这么多系列,主要是针对不同的应用领域;下面详细介绍: Cortex-M分为:M0,M0+,M3,M4,M7 M0,M0+:基础版本,从图中可以看出来,有过于基础,所以生产不出来高性能的STM32的单片机; M3:目前最主流的设计内核选型

学海无涯的专栏 1万+

深入掌握嵌入式处理器:ARM7指令系统

本文还有配套的精品资源,点击获取 简介:嵌入式处理器是计算机科学的重要分支,尤其在各种智能设备中担当核心角色。ARM7指令系统作为一种高效的微处理器架构,备受推崇。本篇将探讨ARM7体系结构及其指令集的细节,涵盖三级流水线、Thumb模式、Jazelle技术等特性。同时,介绍LPC2000系列ARM硬件结构,包括存储器、定时器、串行通信接口等关键组件。此外,本篇还将解析AR...

weixin_33814090的博客 1917

ARM汇编语言指令详解与实践

本文还有配套的精品资源,点击获取 简介:ARM架构是嵌入式系统和移动设备中的主要处理器架构。本文将详细讲解ARM架构中的指令集以及汇编语言,包括不同模式下的指令特点、数据处理、加载存储、分支跳转和浮点运算指令。此外,文章还会介绍汇编语言编程基础和混合编程技巧。掌握这些知识对于开发高效ARM平台应用至关重要,能够帮助开发者编写出更加高效和针对性的代码。本课程通过详细的指令解析...

weixin_32836713的博客 1622

STM32单片机与ARM7、ARM9、ARM11

本内容详细介绍了 ARM 与 STM32 的关系,STM32 与 ARM7、ARM9、ARM11 的区别,美国芯片巨头英伟达欲收购 ARM 资讯。

让你爱上电路设计 6173

【pprof】简要学习教程

基本介绍 pprof 是在做性能优化前的性能分析工具。 安装: go get -u github.com/google/pprof 分析工具 go tool pprof 是命令行指令,用于分析 Profiling 数据,源数据可以是 http 地址,也可以是已经 dump 下当 profile 文件;查看模式可以命令行交互模式,也可以是浏览器模式(-http 参数)。 两种应用 服务型应用 _ "net/http/pprof" 包,专用于采集 web 服务 运行数据的分析。即在运行的服务中通过 API .

码农印象 883

第2章第3节 ARM7芯片的函数调用标…

源码请在https://github.com/ifreecoding/MbedRtos.git下载 第3节ARM7芯片的函数调用标准 在上节,我们最后用汇编语言写了一个函数,但该函数没有入口参数,那么C语言函数、汇编函数之间是如何传递参数和返回值的?函数在执行过程中是如何使用栈的?它们需要遵守什么规则?本节我们将介绍这方面的内容。 如果我们不是在编写操作系统,只是编写正常

ifreecoding的博客 573

raw_count、tpm、fpkm、rpkm如何选择

转录组测序中常见的数据类型有:raw_count、tpm、fpkm、rpkm。本文进行简单辨析: 一、概念 1 raw_count RNA-seq数据中,raw_count一般是指mapped到基因外显子区域的reads数目。比如说htseq,STAR,或者RSEM等NGS分析流程计算产生的counts值。其中RSEM(RNA-Seq by Expectation-Maximization),考虑到一条read 可能会匹配多个exon位置,故而其产生的为expected_count。 2 TPM

weixin_59289660的博客 1万+

【分享】获取微信通讯录python代码形式实现

微信号”, “昵称”, “地区”, “备注”, “标签”, “签名”, “来源”5. 找到最后一个空格所在的位置(后一个就是真正的联系人了)当前微信号与上一个相同的时候,说明到底部了,可以跳出循环。3. 滚动鼠标到最顶部(防止已经滚动了一部分了)7.记录下上一个联系人的微信号。7. 无限循环按键盘下箭头。获取详情中的以下元素内容。6. 点击第一个联系人。4. 获取联系人列表。

程序员老狼专注开发aigc或客服系统应用 2894

第2章第1节 ARM7芯片基本结构

源码请在https://github.com/ifreecoding/MbedRtos.git下载 第1节ARM7芯片基本结构 ARM7芯片构架比较简单,32bits线性地址空间统一排列,任何地址都是唯一的,不同的片上资源及外设被分配到不同的地址空间,不同数据结构的指针固定为4字节长度,这相对51芯片来说方便很多也清晰很多,从用户编程的角度来看入手比较简单,因此本手册首先选用

ifreecoding的博客 900

SPI扩展CAN方案:从寄存器配置到多路通信实战

本文详细介绍了SPI扩展CAN方案的实现方法,从寄存器配置到多路通信实战。通过使用MCP2517FD芯片和SPI接口,可低成本扩展多路CAN通道,适用于工业控制领域。文章涵盖硬件设计、寄存器配置、中断优化及性能调优等核心内容,帮助开发者高效解决设备节点过多的问题。

weixin_42657024的博客 362

ARM 内核寄存器 和 基本汇编语言讲解

对于嵌入式开发者来说,了解汇编语言和内核寄存器是对内核深入理解的基础,本文对 ARM内核寄存器 和 基本汇编语言进行了简单的介绍

不浮夸,不将就,认真对待学知识的我们 4639

手把手教你用Python分析OpenFAST仿真结果:pyDatView处理.out文件与数据可视化技巧

本文详细介绍了如何使用Python中的pyDatView工具分析OpenFAST仿真结果,包括数据加载、质量检查、时域与频域分析、多工况对比及自动化报告生成。通过优化技巧和可视化方法,帮助工程师高效处理.out文件,提升风机性能分析的准确性和效率。

weixin_29311017的博客 183

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5中间件的完整流程,包括环境准备、依赖调整、Web.xml版本适配、部署配置优化及常见问题解决方案。特别针对信创改造需求,提供了排除Tomcat依赖、处理BES专用starter等实用技巧,帮助开发者顺利完成国产中间件迁移。

weixin_30825581的博客 1099

第四章 基于ARM7系列的汇编语言程序设计【嵌入式系统】

第四章 基于ARM7系列的汇编语言程序设计【嵌入式系统】

小心星的博客 2242

一文入门Qwen-Agent【附实战代码】

Qwen-Agent 是一个开源框架,用于开发基于 Qwen 模型的 AI 智能体应用,一文带你入门使用

m0_55303420的博客 1874

ARM汇编语言 - 简介 [一]

origin: https://zhuanlan.zhihu.com/p/82490125 ARM汇编语言 - 简介 [一] 兰新宇 talk is cheap 说明:本系列文章将主要以ARMv7和ARMv8架构为例,介绍ARM汇编语言的一些基础知识。关于ARM汇编语言的学习,这里我要推荐一本书和一个网站,其中书是由宋岩翻译的《Cortex-M3权威指南》,其文笔风趣幽默,引人入胜,网站则是azeria-labs。当然,ARM官方的Architecture Reference Manual更.

yazhouren的专栏 1832

UG/NX二次开发Siemens官方NXOPEN实例解析—1.3 BlockStyler/ExtrudewithPreview

随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。

MarcoPro的博客 1633

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ARM汇编语言指令集汇总

ARM汇编语言指令集汇总跳转指令存储器和寄存器交互数据指令(内存访问)数据传送指令数据算术运算指令数据逻辑运算指令比较指令组合和分离指令并行指令测试指令ThumbEE指令协处理器指令伪指令无线 MMX 技术伪指令其他指令寄存器寻址方式 跳转指令 指令 简介 B 无条件跳转 BL 带链接的无条件跳转 BX 带状态跳转,更改指令集 BLX 带链接和状态切换的无条件跳转,更改指令集 BXJ 跳转,更改为 Jazelle TBB , TBH 表跳转字节、半字 存储器和寄存器交

李玺 4926

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ARM汇编语言

Arm堆栈结构是从高向低压栈的,因为处理器是32位的Arm,所以每压一次栈,SP就会移动4个字节(32位),也就是SP = SP - 4。由于处理器的每种运行模式均有属于自己的物理寄存器R13,使其指向该运行模式下的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈恢复,采用这种方式可以保证异常发生后程序的正常执行。R0-R1 也作为结果寄存器,保存函数返回结果,被调用的子程序在返回前无须恢复这些寄存器的内容。

qq_37770896的博客 1091

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ARM 汇编语言

1. 什么是汇编语言? 计算机处理器,执行的是 二进制的 10101010001,这些机器码对应的助记符就是汇编指令。 处理器 fetch 到的指令是 1001010101, 可能就是 对应汇编语言中 ADD 的加法指令, 处理器执行 加法操作,并把结果输出到目的寄存器。 ARM (RISC)指令长度固定为 32 bits。 2. ARM 指令集 ARM 指令集可以分为下面六类: ...

6385

ARM汇编语言要点(一)

1.       ARM、Thumb、Thumb-2和Thumb-2EE指令集。   2.       ARM、Thumb和ThumbEE状态。 正执行ARM  指令的处理器在 ARM 状态 下工作。 正执行 Thumb  指令的处理器在 Thumb 状态 下工作。 正执行 ThumbEE  指令的处理器在 ThumbEE 状态 下工作。 处理器也可以在称为Jazelle 状态

wowzhangji的专栏 1733

[ARM 汇编]ARM汇编语言基础—1.3.1 汇编语言的概念与作用

在后续的章节中,我们将深入探讨 ARM 汇编语言的各种指令、寻址方式、数据处理方法等内容,并通过更多的实例来帮助您逐步掌握 ARM 汇编编程。:汇编语言可以编写高度优化的代码,充分发挥处理器的性能。:ARM 处理器采用精简指令集计算机(RISC)架构,因此 ARM 汇编语言具有较少的指令类型、较简单的编码规则等特点。:ARM 汇编语言支持多种寻址方式,如立即数寻址、寄存器寻址、基址寻址等,方便程序员编写灵活的代码。:ARM 汇编语言中的大多数指令都是基于寄存器的操作,这有助于提高指令执行效率和代码密度。

Andy0214的专栏 5222

ARM:ARM汇编语言与基础汇编指令

1、为什么要学习汇编语言? 1)嵌入式硬件上电的初始化代码是用汇编代码编写; 2)调试代码时,问题的解决有可能看汇编代码; 3)系统调优(提高产品整体运行效率); memcpy:C语言函数原型 :汇编代码 - 效率更高 4)有些逻辑,拿C语言无法实现 例如,用c访问r5寄存器

Hello, New World! 2万+
上一篇: 第2章第1节 ARM7芯片基本结构
下一篇: 第2章第3节 ARM7芯片的函数调用标…
ifreecoding
博客等级 码龄15年 148粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值