❶ “ARM指令下如何按字对齐执行指令”
纯arm指令是按4字节对齐,arm为节省空间也包含thumb指令,后者按2字节对齐。
如果想保证指令全部为四字节对齐,需要在编译时强制编译arm
mk中编译选项为LOCAL_ARM_MODE := arm
❷ ARM指令集的ARM 指令列表
ADC 带进位的32位数加法 ADD 32位数相加 AND 32位数的逻辑与 B 在32M空间内的相对跳转指令 BEQ相等则跳转(Branch if EQual)BNE不相等则跳转(Branch if Not Equal)BGE大于或等于跳转(Branch if Greater than or Equa)BGT大于跳转(Branch if Greater Than)BIC 32位数的逻辑位清零 BKPT 断点指令 BL 带链接的相对跳转指令 BLE小于或等于跳转(Branch if Less than or Equal)BLEQ带链接等于跳转(Branch with Link if EQual)BLLT带链接小于跳转(Branch with Link if Less Than)BLT小于跳转(Branch if Less Than)BLX 带链接的切换跳转 BX 切换跳转 CDP CDP2 协处理器数据处理操作 CLZ 零计数 CMN 比较两个数的相反数 CMP 32位数比较 EOR 32位逻辑异或 LDC LDC2 从协处理器取一个或多个32位值 LDM 从内存送多个32位字到ARM寄存器 LDR 从虚拟地址取一个单个的32位值 MCR MCR2 MCRR 从寄存器送数据到协处理器 MLA 32位乘累加 MOV 传送一个32位数到寄存器 MRC MRC2 MRRC 从协处理器传送数据到寄存器 MRS 把状态寄存器的值送到通用寄存器 MSR 把通用寄存器的值传送到状态寄存器 MUL 32位乘 MVN 把一个32位数的逻辑“非”送到寄存器 ORR 32位逻辑或 PLD 预装载提示指令 QADD 有符号32位饱和加 QDADD 有符号双32位饱和加 QSUB 有符号32位饱和减 QDSUB 有符号双32位饱和减 RSB 逆向32位减法 RSC 带进位的逆向32法减法 SBC 带进位的32位减法 SMLAxy 有符号乘累加(16位*16位)+32位=32位 SMLAL 64位有符号乘累加((32位*32位)+64位=64位) SMALxy 64位有符号乘累加((32位*32位)+64位=64位) SMLAWy 号乘累加((32位*16位)>>16位)+32位=32位 SMULL 64位有符号乘累加(32位*32位)=64位 SMULxy 有符号乘(16位*16位=32位) SMULWy 有符号乘(32位*16位>>16位=32位) STC STC2 从协处理器中把一个或多个32位值存到内存 STM 把多个32位的寄存器值存放到内存 STR 把寄存器的值存到一个内存的虚地址内间 SUB 32位减法 SWI 软中断 SWP 把一个字或者一个字节和一个寄存器值交换 TEQ 等值测试 TST 位测试 UMLAL 64位无符号乘累加((32位*32位)+64位=64位) UMULL 64位无符号乘累加(32位*32位)=64位
❸ ARM中的汇编指令ASR指令MOV R0, R1, ASR#2
因为首先ASR是“算术”右移指令,因此用它来操作数据时,指令会认为被操作的数是有符号数,而二进制中有符号数的最高位即为符号位。因此为了保留数据符号,用符号位来填充因移位而导致的空缺位。举例是这样的:
MOV R1, 0x90000000;
MOV R0, R1, ASR #2;
//因为R1里面的最高字节是0x90,也就是二进制10010000,又是算数右移,所以会用最高位这个'1'填充空出来的位,移位完也就成了11100100_00,所以放到R0里面成了0xE4000000。
❹ ARM指令AND指令问题
AND 指令: 逻辑与操作;
#3 :立即数字 3; 十六进制表达 0x3;
综合: AND RO,R0,#3 ->是将R0寄存器的值与数字3(0x0000003)逻辑与;
最后的结果保存到R0;
进行与操作后,只会保留R0的低2位,具体见逻辑与。
❺ ARM 汇编语言指令
ARM处理器有9种寻址方式:
1、寄存器寻址,2、立即寻址,3、寄存器器移位寻址,4、寄存器间接寻址,5、基址寻址,6、多寄存器寻址,7、堆栈寻址,8、块拷贝寻址,9、相对寻址。
ARM指令集:ARM指令基本格式如下:
<OPCODE>{<COND>}{S} <Rd> ,<Rn>{,<OPERAND2>}
其中<>的内容是必须的,{}的内容是可选的。OPCODE指令助记符。
❻ ARM指令集的详解
1.跳转指令
通过直接向PC寄存器中写入目标地址值可以实现在4GB地址空间中任意跳转,这种跳转指令又称为长跳转。如果在长跳转指令之前使用MOV LR,PC等指令,则可以保存将来返回的地址值,这样就实现了在4GB地址空间中的子程序调用。
在ARM版本5及以上的体系中,实现了ARM指令集和Thumb指令集的混合使用。指令使用目标地址值的bit[0]来确定目标程序的类型。bit[0]的值为1时,目标程序为Thumb指令;bit[0]值为0时,目标程序为ARM指令。
在ARM版本5以前的体系中,传送到PC寄存器中的目标地址值的低两位bits[1∶0]被忽略,跳转指令只能在ARM指令集中执行,即程序不能从ARM状态切换到Thumb状态。非T系列ARM版本5体系不含Thumb指令,当程序试图切换到Thumb状态时,将产生未定义指令异常中断。
ARM跳转指令可以从当前指令向前或向后的32MB地址空间跳转。这类跳转指令有以下4种。
(1)B 跳转指令
B〔条件) (地址)
B指令属于ARM指令集,是最简单的分支指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的地址,从那里继续执行。注意:存储在分支指令中的实际值是相对当前R15的值的一个偏移量,而不是一个绝对地址。它的值由汇编器来计算,是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移位为26位(+/- 32 MB)。
(2)BL 带返回的跳转指令
BI,〔条件) (地址)
BL指令也属于ARM指令集,是另一个分支指令。就在分支之前,在寄存器R14中装载上R15的内容,因此可以重新装载R14到R15中来返回到这个分支之后的那个指令处执行,它是子例程的一个基本但强力的实现。
(3)BLX 带返回和状态切换的跳转指令
BLX <地址>
BLX指令有两种格式,第1种格式的BLX指令记作BLX(1)。BLX(1)从ARM指令集跳转到指令中指定的目标地址,并将程序状态切换到Thumb状态,该指令同时将PC寄存器的内容复制到LR寄存器中。
BLX(1)指令属于无条件执行的指令。
第2种格式的BLX指令记作BLX(2)。BLX(2)指令从ARM指令集跳转到指令中指定的目标地址,目标地址的指令可以是ARM指令,也可以是Thumb指令。目标地址放在指令中的寄存器<dest>中,该地址的bit[0]值为0,目标地址处的指令类型由CPSR中的T位决定。该指令同时将PC寄存器的内容复制到LR寄存器中。
(4)BX 带状态切换的跳转指令
BX(条件) (dest)
BX指令跳转到指令中指定的目标地址,目标地址处的指令可以是ARM指令,也可以是Thumb指令。目标地址值为指令的值和0xFl·FFFFFF做“与”操作的结果,目标地址处的指令类型由寄存器决定。
❼ 关于arm指令中的<<符号
<<是左移位的意思,跟C语言里面的是一样的。
U_MDIV<<12 就是把U_MDIV 向左移位12位
❽ ARM 指令
arm 是一个cpu内核公司,比如三星公司想弄一个集工业,娱乐于一体的芯片2440,cpu内核用arm,嵌入式芯片其他的外围构件是三星自己弄的,你用指令控制cpu,当然是arm指令了,所以arm机构的主控芯片,95%指令相同 ,arm不同的核心也有小小区别,比如ARM920T和arm1120t的p15(控制mmu,cache)协处理器指令就不同,不过很少用你直接控制p15,具体要查芯片手册。
❾ ARM指令问题
这相当于压栈操作。 R1是一个指向内存某个单元的指针, 这条指令的意思是,先把R0里的内容送到R1所指的内存单元里去,然后R1加4(跳到下一个内存单元),然后再把R2送到R1所指单元去,依此类推。。
❿ ARM汇编指令
应该是mov r0, #0x18吧
我觉得这两条语句与swi并不相干,可能只是传递参数用的,并不是说swi一定要先这么设置