zoukankan      html  css  js  c++  java
  • ARM指令

    语法格式

    <opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>
    

    {}表示是可选的部分,<>表示是必要的部分

    条件码

    大部分ARM指令都支持条件执行,即满足某些条件的时候执行当前指令,同时,还配合有S位用来指示当前指令是否会映像CPSR相应的位。

    EQ Equal 相等 Z=1
    NE Noequal 不相等 Z=0
    CS/HS CarrySet/HighorSame 无符号数>= C=1
    CC/LO CarryClear/LOwer 无符号数< C=0
    MI MInus 负数 N=1
    PL Plus 非负数 N=0
    VS oVerflowSet 上溢出 V=1
    VC oVerflowClear 没有上溢出 V=0
    HI HIgh 无符号> C=1&&Z=0
    LS LowerorSame 无符号数<= C=0
    GE GreaterorEqual 带符号数>= N=1&&V=1或 N=0&&V=0
    LT LessThan 带符号数< N=1&&V=0或 N=0&&V=1
    GT GreaterThan 带符号数> Z=0&&N=V
    LE LessEqual 带符号数<= Z=1&&N!=V
    AL 无条件执行

    跳转

    B指令跳转的范围是PC+-32M,因为ARM一条指令32bit,操作码B占了6bit,还有24bit装数据,考虑到ARM的地址是4byte对齐的,所以最后的两位都会是0,所以就可以用24bit数据表达26bit的地址空间,2^26=64M,即+-32M。如果需要跳转的地址距离PC超过了32M,可以将目标地址压栈,通过内存将地址传递给PC实现长跳转

    B{<cond>}		<target_addr>
    BL{<cond>}		<target_addr>
    BX{<cond>},		<Rm>
    BLX	<target_address>
    BLX{<cond>}	<Rm>
    

    数据处理

    • 注意立即数的合法性问题
    • 立即数=(8bit数据) ROR 偶数位,如果不能通过这种方式得到,就会报错
    • {S}用于表示当前指令的操作结果是否影响CPSR中的相应位
    MOV{<cond>}{S}	<Rd>,	<shifter_operand>			;数据传送
    MVN{<cond>}{S}	<Rd>,	<shifter_operand>			;数据求反传送
    ADD{<cond>}{S} 	<Rd>,	<Rn>,	<shifter_operand>		;加法
    ADC{<cond>}{S} 	<Rd>,	<Rn>,	<shifter_operand>		;带位加法
    SUB{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;减法
    SBC{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;带位减法
    RSB{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;逆向减法
    RSC{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;带位逆向减法
    AND{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;逻辑与
    ORR{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;逻辑或
    EOR{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;逻辑异或
    BIC{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;位清除
    CMP{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;比较
    CMN{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;基于相反数的比较
    TST{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;位测试
    TEQ{<cond>}	<Rn>,	<shifter_operand>		        ;相等测试
    

    数据处理指令的操作数寻址方式(shifter_operand)

    <opcode>{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>
    #<immediate>                     ;立即数寻址
    <Rm>                             ;寄存器寻址
    <Rm>,LSL    #<shift_imm>        ;立即数逻辑左移
    <Rm>,LSL    <Rs>                ;寄存器逻辑左移
    
    <Rm>,LSR    #<shift_imm>        ;立即数逻辑右移
    <Rm>,LSR    <Rs>                ;寄存器逻辑右移
    
    <Rm>,ASR    #<shift_imm>        ;立即数算术右移
    <Rm>,ASR    <Rs>                ;立即数算术右移
    
    <Rm>,ROR    #<shift_imm>        ;立即数循环右移
    <Rm>,ROR    <Rs>                ;寄存器循环右移
    
    <Rm>,RRX                        ;寄存器扩展循环右移
    

    乘法指令

    任何乘法指令都必须使用寄存器,不能使用立即数

    MUL{<cond>}{S}	<Rd>,	<Rm>,	<Rs>				;32位乘法
    MLA{<cond>}{S}	<Rd>,	<Rm>,	<Rs>,	<Rn>	;32位带加数的乘法
    SMULL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位有符号数乘法
    SMLAL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位带加数的有符号数乘法
    UMULL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位无符号数乘法
    UMLAL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位带加数的无符号数乘法
    

    PSR指令

    MRS{<cond>}	<Rd>,	CPSR							;将PSR的内容传送到通用寄存器中
    MRS{<cond>}	<Rd>,	SPSR							
    MSR{<cond>}	CPSR_<fields>,	#<immediate>			;将通用寄存器的内容或一个立即数传送到PSR
    MSR{<cond>}	CPSR_<fields>,	<Rm>					
    MSR{<cond>}	SPSR_<fields>,	#<immediate>	
    MSR{<cond>}	SPSR_<fields>,	<Rm>	
    

    内存访问

    B字节,H半字,T用户模式,S由有符号

    LDR{<cond>		<Rd>,	<addressing_mode>				;字数据读取
    LDR{<cond>}B	<Rd>,	<addressing_mode>				;字节数据读取
    LDR{<cond>}BT	<Rd>,	<addressing_mode>				;用户模式的字节数据读取
    LDR{<cond>}H	<Rd>,	<addressing_mode>				;半字数据读取
    LDR{<cond>}SB	<Rd>,	<addressing_mode>				;有符号的字节数据读取
    LDR{<cond>}SH	<Rd>,	<addressing_mode>				;有符号的半字数据读取
    LDR{<cond>}T	<Rd>,	<post_indexed_addressing_mode>		;用户模式的字数据读取
    STR{<cond>}		<Rd>,	<addressing_mode>				;字数据写入
    STR{<cond>}B	<Rd>,	<addressing_mode>				;字节数据写入
    STR{<cond>}H	<Rd>,	<addressing_mode>				;半字数据写入
    STR{<cond>}T	<Rd>,	< post_indexed_addressing_mode>	;用户模式字数据写入
    

    批量内存访问

    LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers>			;批量内存字数据读取
    LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers_without_pc>	;用户模式的批量内存字数据读取
    LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers_and_pc>		;带PSR的批量内存字数据读取
    STM{<cond>}<addressing_mode>	<Rn>{!},		<registers>			;批量内存字数据写入
    STM{<cond>}<addressing_mode>	<Rn>,		<registers>			;用户模式的批量内存字数据写入
    

    异常发生指令

    SWI{<cond>}	<immed_24>		;软中断
    BKPT	<immediate>			;断点中断
    
  • 相关阅读:
    MovieLens
    牛顿法与拟牛顿法学习笔记(一)牛顿法
    Softmax回归
    PCA练习
    PCA主成分分析
    算法——A*——HDOJ:1813
    spring 入门篇
    java——多线程——单例模式的static方法和非static方法是否是线程安全的?
    java——数据库——commons-DbUtils
    java——HashCode和equal方法
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/5951472.html
Copyright © 2011-2022 走看看