你好!
<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}
其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
opcode 指令助记符,如LDR,STR等
cond 执行条件,如EQ,NE等
S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响
Rd 目标寄存器
Rn 第一个 *** 作数的寄存器
operand2 第二个 *** 作数。在ARM指令中,灵活的使用第2个 *** 作数能提高代码效率,第2个 *** 作数的形式如0x3FC、0、0xF0000000、200,0xF0000001等。
指令格式举例如下:
LDR R0,[R1] ;读取R1地址上的存储器单元内容,执行条件AL
BEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN
ADDS R1,R1,#1 ;加法指令,R1+1=R1 影响CPSR寄存器,带有S
SUBNES R1,R1,#0xD ;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR寄存器,带有S
(2)条件码
几乎所有的ARM指令都包含一个可选择的条件码,即{<cond>}。使用指令条件码,可实现高效的逻辑 *** 作,提高代码效率。ARM条件码如表所示。
*** 作码[31:28]
条件码助记符
标志
含义
0000
EQ
Z=1
相等
0001
NE
Z=0
不相等
0010
CS/HS
C=1
无符号数大于或等于
0011
CC/LO
C=0
无符号数小于
0100
MI
N=1
负数
0101
PL
N=0
正数或零
0110
VS
V=1
溢出
0111
VC
V=0
没有溢出
1000
HI
C=1,Z=0
无符号数大于
1001
LS
C=0,Z=1
无符号数小于或等于
1010
GE
N=V
带符号数大于或等于
1011
LT
N!=V
带符号数小于
1100
GT
Z=0,N=V
带符号数大于
1101
LE
Z=1,N!=V
带符号数小于或等于
1110
AL
任何
无条件执行(指令默认条件)
1跳转指令
跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转:
—使用专门的跳转指令。
—直接向程序计数器 PC 写入跳转地址值。
通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用 MOV LR,PC 等类似指令,可以保存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。
ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下4条指令:
— B 跳转指令
— BL 带返回的跳转指令
— BLX 带返回和状态切换的跳转指令
— BX 带状态切换的跳转指令
B 指令的格式为:
B{条件} 目标地址
B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前 PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是24位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后 32MB 的地址空间)。以下指令:
B Label ;程序无条件跳转到标号Label处执行
CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行
BEQ Label
BL 指令的格式为:
BL{条件} 目标地址
BL 是另一个跳转指令,但跳转之前,会在寄存器 R14 中保存 PC 的当前内容,因此,可以通过将 R14 的内容重新加载到 PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令:
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中
BLX 指令的格式为:
BLX 目标地址
BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有 ARM 状态切换到 Thumb 状态,该指令同时将 PC 的当前内容保存到寄存器 R14 中。因此,当子程序使用 Thumb 指令集,而调用者使用 ARM指令集时,可以通过 BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器 R14 值复制到 PC 中来完成。
BX 指令的格式为:
BX{条件} 目标地址
BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是 ARM 指令,也可以是 Thumb指令。
希望能够帮助你!
我觉得答案讲的够详细了
我只想纠正标题的一个小错误,可能会影响理解:
(unsigned int)0x100000=1234是不合法的,作者的意思大概是
(unsigned int)0x100000=1234注意开头的“ ”
至于“让程序跳转到0x100000执行”,下面的写法与答案的原理相同
typedef void VoidFunc(); // VoidFunc 是个函数类型((VoidFunc)0x100000)();// 类比
(unsigned int)0x100000=1234;
(( VoidFunc)0x100000)();
// 不难找到相似之处,只不过一个是把0x100000“变成”unsigned int类型的对象
// 一个是“变成”VoidFunc类型的函数而已
这个范围的限制呢,是要看指令编码了,b指令的编码是这样的
3128:条件码
2725:101
24:是否链接标志
230:跳转的地址
地址值呢,只有24位长度,因为arm指令是字对齐的,最低2位永远为0,所以最大值也就是前后32mb的范围,
不过虽然这条指令是有32mb的限制,但是超出32mb时,也是可以使用的,我们也不知道链接器会把目的块放到哪里,必要时链接器会自动添加一些代码实现长距离的跳转。
所以在实际使用中,不用去管这个32mb的限制,当成一个绝对跳转指令就行了。
重点问题在那个basePath <base href="<%=basePath%>"> 设置了这个之后 这个页面所有的连接都会自动加上你的项目根目录的 所以你访问的时候没有必要写全路径了 直接 index 就可以咯
在 C 语言中,可以使用函数的返回值来实现从子程序中直接跳转到其他地方。
例如,您可以在 R_NEED_MAN_DO 子函数中添加一个 if 语句,判断 PLC_GI0 的值是否为 88,如果是,则返回一个特定的值,用于指示在主函数中跳转到其他位置。您可以使用 return 语句来实现这一点。示例代码如下:
int R_NEED_MAN_DO() {
// do something
if (PLC_GI0 == 88) {
return 1;
}
// do something else
}
然后,在您的主函数中,可以根据 R_NEED_MAN_DO 的返回值来实现跳转。例如,如果返回值为 1,则可以使用 goto 语句跳转到指定的位置。示例代码如下:
int main() {
// do something
int result = R_NEED_MAN_DO();
if (result == 1) {
goto my_label;
}
// do something else
my_label:
// do something after jump
}
请注意,在大多数情况下,使用 goto 语句来实现跳转是不推荐的,因为它会导致代码难以维护和理解。在实际编写代码时,应尽量避免使用 goto 语句,并尝试使用其他结构来控制程序流程。
绝对地址、相对地址、混合地址的区别
一、组成不同
1、在互联网上绝对地址由IP4规则构成,共4组数字每组数字从0~255,由“"号间隔,格式为XXXXXXXXXXXX,此数组为互联网上的独立地址,在任何网站通过这个地址可以直接到达目标网页,包含主域名和目录地址。
2、混合地址在公式中使用相对地址引用,公式复制过程中引用地址(值)随位置而变;比如C1中“=A1”复制到C2,公式将自动地变成“=A2”,如果复制到D1,公式变为“=B1”,体现出相对引用在公式复制中——横向复制变列号,纵向复制变行号。
3、相对地址是指相对于某个基准量(通常用零作为基准量)编址时所使用的地址。相对地址常用于程序编写和编译过程中,由于程序要放入主存中才能执行,因此指令和数据都要与某个主存绝对地址发生联系——放入主存单元。
二、存储方式不同
1、绝对地址由于多道程序系统中,主存将存放多道作业,因此程序员不可能了解自己的程序将放在主存中何处运行,也就是说程序员不能用绝对地址来编程。因此往往相对于某个基准地址来编写程序并安排指令和数据的位置,这时用的就是相对地址,所以相对地址是用于程序编写和编译中的地址系统。
2、相对地址在数据传输和存储中主存储器的存储单元以字节为单位,每个存储单元都有一个地址与其对应,假定主存储器的容量为n,则该主存储器就有n个存储单元(既n个字节的存储空间),其地址编号为:0,1,2,,n-1。把主存空间的地址编号称为主存储器的绝对地址,与绝对地址对应的主存空间称为物理地址空间。
3、混合地址在公式中使用混合引用,$A1、 $A2只有在纵向复制公式时行号,如C1中“=$A1”复制到C2,公式改变为“=$A2”,而复制到D1则仍然是“=$A1”,也就是说形如$A1、 $A2的混合引用“纵变行号横不变”。而B$1、 B$2恰好相反,在公式复制中,“横变列号纵不变”。
三、单元格的变化不同
1、相对地址中的内容随着单元格地址而变化。
2、绝对地址在行号和列号前面加上“”符号,绝对地址复制到其它单元中,单元格的地址保持不变。
3、混合地址是指单元格地址中既有绝对地址引用又有相对地址引用。
以上就是关于跳转指令全部的内容,包括:跳转指令、对绝对地址0x100000赋值,可以用(unsigned int*)0x100000=1234;如果让程序跳转到0x100000执行,怎么办、arm汇编b指令是绝对地址还是相对地址跳转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)