寄存器杂记
(1)单寄存器加载指令:
LDR R0,[R1] :将内存中的一个字(4字节)加载到寄存器R0中。
LDRB R0,[R1] :将内存中的一个字节加载到寄存器R0中。
LDRSB R0,[R1] :与上一条指令不同,本指令加载的一字节需要确定寄存器R0的高24bit时什么,上一条指令,R0的高24bit位补0,而本条指令,R0的高24bit补符号位。
(2)单寄存器存储指令:
STR R0,[R1] :存储字指令,将R0中的值存储到4字节中。
STRB R0,[R1] :存储字节指令,将R0的低8bit存储到内存的1字节中
(3)分支指令:
(跳转范围是当前指令±32MB地址范围之内)
B label :跳转到标号label处,也就是该条指令结束后,下一条指令执行的就是标号处的指令。
BL label :与B指令相同,也实现跳转,同时还返回地址(BL下一条指令地址)保存到LR中。
BX R0 :将R0的值作为地址,跳转到该地址处,并根据R0的值决定是否在ARM和Thumb之间进行切换。
(4)数据处理指令:
MOV R0,R1 :将R1的值赋给R0。
ADD(SUB) R0,R1,R2 :将R1的值加上(减去)R2的值,结果保存在R0中。
AND(ORR、EOR) R0,R1,R2 :将R1的值与(或,异或)R2的值,结果保存在R0中。
CMP R1,R2 :比较R1、R2的大小。【本指令运行的细节是(见寄存器中的CPSR):执行R1-R2的操作,结果为负数时,CPSR的N位置位,Z位清零;结果为0时,CPSR的N位清零,Z位置位;结果为正数时,CPSR的N位清零,Z位清零。但R1-R2的结果不保存,该指令常用于分支跳转】
movl var, %eax #把内存地址var处的内容放入寄存器%eax中
movl %cs:var, %eax #把代码段中内存地址var处的内容放入%eax中
movb $0x0a, %es:(%ebx) #把字节值0x0a保存到es段的%ebx指定的偏移处
movl $var, %eax #把var的地址放入%eax中
movl array(%esi), %eax #把array+%esi确定的内存地址处的内容放入%eax中
movl (%ebx,%esi,4), %eax #把%ebx+%esi*4确定的内存地址处的内容放入%eax中
movl array(%ebx,%esi,4), %eax #把array+%ebx+%esi*4确定的内存地址处的内容放入%eax中
movl -4(%ebp), %eax #把%ebp-4内存地址处的内容放入%eax中,使用默认段%ss
movl foo(,%eax,4), %eax #把内存地址foo+eax*4处内容放入%eax中,使用默认段%ds
R15---别名PC(Program Counter)程序计数器
R14---别名LR(Linked Register)链接寄存器
R13---别名SP(Stack Pointer)堆栈指针寄存器
PC的值=当前执行指令内存中的地址+8
CPSR---(Current Program Status Register)当前程序状态寄存器,作用是保存当前程序的状态,由以下几部分组成:
(1)条件码标志位:ARM指令条件执行的依据
1)N:运算结果的最高位反映在该标志位。对于有符号二进制补码,结果为负数时N=1,正数或零时N=0。
2)Z:指令结果为零时Z=1(通常表示结果“相等”)否则Z=0。
3)C:当进行加法运算时(包括CMN指令),并且最高位产生进位时C=1,否则C=0。
当进行减法运算时(包括CMP指令),并且最高位产生借位时C=0,否则C=1。
对于结合移位操作的非加法、减法指令,C为最高位最后移出的值,其它指令C通常不变。
4)V:当进行加减法运算,并且有符号溢出时V=1,否则V=0。其它指令V通常不变。
(2)控制位:控制CPU是否响应中断。
1)I:中断禁止位,当I置位时IRQ中断被禁止
2)F:快中断禁止位,当I置位时FIQ中断被禁止
3)T:反应CPU当前的状态。当T位置位时,处理器在Thumb状态下运行,当T位清零时,处理器在ARM状态下运行。
(3)模式位:包括M4、M3、M2、M1、M0,这些位决定处理器的模式(处理器有7中模式:用户、快中断、中断、管理、中止、未定义、系统)
SPSR---(save program status register)保存程序状态寄存器,当异常发生时,由硬件自动将异常发生前的CPSR的值保存在SPSR中,以便将来处理异常结束后,程序能恢复原来的CPSR的值。