如何用c语言定义r13寄存器为堆栈指针?

如何用C语言定义arm状态下的r13寄存器为堆栈指针这个应该是不需要定义的吧。arm汇编b指令是绝对地址还是相对地址跳转?arm汇编的符号命名和书写规则有哪些特殊符号对应指令含义示例^MAP定义结构化内存表MAP4096;内存表首地址为4096#FIELD定义内存表中的数据,结合MAP指令使用MAP4096STACKSVCFIELD256;定义从4096开始的256字节为SVC的堆栈空间。

1、帮忙解释一下这段ARM汇编程序代码,谢谢!2、ARMlinux内核启动时几个关键地址3、一小段关于LDR简单的ARM代码

LDRRO,LOOPTEST//R0存放的是B指令的机器码LDRR1,LOOPTEST//R1存放的是LOOPTEST的地址LOOPTESTBLOOPTESTEND因为B指令的机器码是0XEAFFFFFE,而B这条指令的地址是0X。其他的就是cumt_xiaopeng说的了。这个其实就是汇编中的跳转,我来注释下:AREATEST,

READONLY//定义代码段,名为TEST,属性是只读ENTRY//程序入口LDRRO,LOOPTEST//将LOOPTEST地址对应的值给R0LDRR1,LOOPTEST//将LOOPTEST(他为地址)给R1LOOPTEST//以下两行为循环跳转,程序将停在此处BLOOPTESTEND。

4、在ARM嵌入式中,什么是与位置相关的代码,什么是与位置无关的代码?

举个例子:排队时1.A排在第一的位置,B排在第二的位置2.A排在B的前面这两种情况,都说明的A和B的位置关系,而第一种跟位置相关,属于绝对地址;而第二种情况则跟位置无关,属于相对地址。位置无关码:CPU取指时,总是相对于本条执行指令的相对地址去取指。比如指行一个ADD指令时,PC要取下一指令的地址,就在原来的基础上 4。

5、arm汇编的符号命名和书写规则有哪些

特殊符号对应指令含义示例^MAP定义结构化内存表MAP4096;内存表首地址为4096#FIELD定义内存表中的数据,结合MAP指令使用MAP4096STACKSVCFIELD256;定义从4096开始的256字节为SVC的堆栈空间。%SPACE分配一块内存,并用“0”初始化DataStrucSPACE280;分配280字节内存并初始化[|]IFELSEENDIF条件编译,有选择的确定需要编译的代码IF,ELSE,ENDIF,可以嵌套使用IF逻辑表达式指令或伪指令ELSE指令或伪指令ENDIF另外还有符号:$如果在串变量前有一个$,则在汇编时编译器将用该串变量的数值取代该串变量,如:GBLSSTR1GBLSSTR2STR1SETS“pen.”STR2SETS“Thisisa$STR1编译后的结果是STR2的值为Thisisapen.如果$后是数字变量(与串变量区分),在汇编时编译器将该数字变量的数值转换成十六进制的串,然后用该十六进制的串取代$后的数字变量。

6、如何使用arm汇编指令实现结构化编程

ARM汇编程序特点:l所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值.lARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,

(比如说进位,为0,为负…)CMPR0,R1BNENoMatch比如上一句,BNE隐含的使用的上一句CMP执行结果.NE后缀表示使用Z标志位.两句合起来的意思就是,如果R0,R1的值不相等,就跳转到NoMatch处执行.注意,PCR15,CPSRR16,ARM伪指令不是必须的,但是一个完整没有伪指令几乎很难写出来.n比如一个程序至少包含READONLYAREA和ENTRY,

7、arm汇编b指令是绝对地址还是相对地址跳转?

这个范围的限制呢,是要看指令编码了,B指令的编码是这样的31..28:条件码27..25:10124:是否链接标志23..0:跳转的地址地址值呢,只有24位长度,因为ARM指令是字对齐的,最低2位永远为0,所以最大值也就是前后32MB的范围,不过虽然这条指令是有32MB的限制,但是超出32MB时,也是可以使用的,我们也不知道链接器会把目的块放到哪里,必要时链接器会自动添加一些代码实现长距离的跳转。

8、如何用C语言定义arm状态下的r13寄存器为堆栈指针

这个应该是不需要定义的吧。ARM体系结构下,R13通常就被用于是SP。1,你如果用C语言编程的话,堆栈跟你见不着面,编译器会处理,何来定义堆栈之说?2,你如果是用汇编和C混合编程的话你就只能用约定俗成的SP寄存器,3,如果只用ARM汇编的话,在汇编代码里你可以随便用任何寄存器来充当堆栈的角色,无非就是在程序初始化时将哪个寄存器赋一个地址,然后你把这个寄存器当作栈指针寄存器,进行压栈和出栈操作时来改变或恢复这个寄存器的值,这样一来就完成了在汇编代码里的操作堆栈的功能。

9、armIO口地址

没有去看2200的spec,但是从你的宏定义(应该知道什么是宏定义吧)大致可以猜出来首先P0.8P0.6应该分别指的是GPIO的P0口(很可能是32位的)的第8位和第6位管脚吧(从第0开始)。我们每个人都和你一样,曾经死去,如林间的树叶飘落哈哈,破碎,弯曲,又被冬天的风霜摧残,变脆。#defineSPI_CS0x/*P0.8*/0x你看ARM的指导手册。

都是ARM出厂时规定好的0x就是P0.8这个口define是宏定义把SPI_CS这个SPI片选引脚(这时是软件上的,没有实际用途只是一个符号)和硬件地址联系起来联系以后可以用SPI_CS代表片选信号进行操作了。(你总不能每次对SPI片选操作都用0x这么长地址表示吧,当然你也可以直接诶用0x来操作,这个不直观对吧)麻烦详细解释下0X等与P0.8等之间的关系如何转换的为什么。

定义 r13 arm 堆栈 寄存器