马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
立即寻址也称为立即数寻址,是一种特殊的寻址方式。操作数是直接通过指令给出,数据就包含在指令的32位编码中,只要取出指令就可在指令执行时得到立即操作数。例如指令: ADD R0,R0,#1 ;R0<-R0+1 AND R8,R7,#0xFF ;R8<-R7 AND“0xFF” 第一条指令完成寄存器R0的内容加1,结果放回R0中。第2条指令完成R7的32位值与 0xFF相“与”的结果送到R8中。 若第2个源操作数为一个立即数,则以#为前缀。在#后加0x或&表示十六进制值数;在#后加0b表示二进制值数;在#后加0d或缺省时表示十进制值数。 需要注意的是,如果一个32位指令编码中,就有可能完全占据32位编码空间,而使指令的操作码等无法在编码中体现。在ARM指令编码中,32位有效立即数是通过循环右移偶数位而间接得到。 在ARM数据处理指令中,当参与操作的第2操作数为立即数型时,每个立即数都是采用一个8位的常数循环右移偶数位而间接得到,其中循环右移的位数由一个4位二进制的2倍表示。如果立即数记作<immediate>,8位常数记作immed_8,4位的循环右移值记作rotate_imm,有效的立即数是由一个8位的立即数循环右移偶数位得到,则有效立即数immediate可表示成: <immediate>=immed_8循环右移(2×rotate_imm) 采取间接表示,一个32位立即数在指令编码只需要用12位编码表示。这样编码的缺点是,并不是每一个32位的常数都是合法的立即数,只有通过上面的构造方法得到的才是合法的立即数,因此使用立即数时要特别注意。 例如,常数0x0000F200、0x00110000或0x00012800等是合法的立即数,能通过上述构造方法得到。 应用例子中如下所示: .text _start: MOV R0,#0x0000F200 MOV R1,#0x00110000 MOV R4,#0x00012800 ADD R2,R1,R0 BGE Here Stop: B stop HERE:SUB R3.R4.R1 .net 其中,带有3个立即数的MOV指令的二进制编码为 8000:E3A00CF2 / MOV R0,#0xF200/ 8004:E3A01811 / MOV R1,#0x110000/ 8008:E3A04B4A /MOV R4,#0x12800/ 由此可以看出: 指令(1)中立即数0xF200是由E3A00CF2中的后12位0xF2间接表示的,即是由8位的0xF2循环右移24(2×12)位得到。 指令(2)中立即数0x1100000是由E3A01811中的后12位0x811间接表示的,即是由8位的0x11循环右移16(2×8)位得到。
指令(3)中立即数0x12800是由E3A04B4A中的后12位0XB4A间接表示的,即是由8位的0x4A循环右移24(2×12)位得到。 而0x1010、0x00102或0xFF10000等常数不是合法的立即数,不能通过合法的构造方法得到。 显然,对于8位立即数不需要经过移位间接表示,而可以直接表示。 凌阳教育,专注嵌入式人才培养13年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |