LSL(Logical Shift Left):moves each bit of a bitstring left by a specified number of bits. Zeros are shifted in at the right end of the bitstring. Bits that are shifted off the left end of the bitstring are discarded, except that the last such bit can be produced as a carry output.
左移位串中的每一位,在位串的右端移入0,左端移出的位,除了最后移出的一位可以用作进位输出,其它的全部丢弃
LSR(Logical Shift Right):moves each bit of a bitstring right by a specified number of bits. Zeros are shifted in at the left end of the bitstri ng. Bits that are shifted off the right end of the bitstring are discarded, except that the last such bit can be produced as a carry output.
右移位串中的每一位,在位串的左端移入0,右端移出的位,除了最后移出的一位可以用作进位输出,其它的全部丢弃
ASR(Arithmetic Shift Right):moves each bit of a bitstring right by a specified number of bits. Copies of the leftmost bit are shifted in at the left end of the bitstring. Bits that are shifted off the right end of the bitstring are discarded, except that the last such bit can be produced as a carry output.
右移位串中的每一位,复制位串中最左端的位移入位串左端,除了最后的一位可以用作进位输出,其它的全部丢弃
ROR(Rotate Right):moves each bit of a bitstring right by a specified number of bits. Each bit that is shifted off the right end of the bitstring is re-introduced at the left end. The last bit shifted off the the right end of the bitstring can be produced as a carry output.
右移位串中的每一位,右端移出的位在左端移入,右端最后移出的位作为进位输出
例:
AREA ROR_Code, CODE, READONLY
ENTRY
start MOV r0, #0x104
MOV r1, #0x108
ADD r2, r1, r0
END
使用ADS 1.2编译代码,然后Debug,在AXD中可以看到:
[0xe3a00f41] mov r0,#0x104
[0xe3a01f42] mov r1,#0x108
[0xe0812000] add r2,r1,r0
第一列中括号中的内容,就是ARM处理器可执行的机器指令的十六进制形式,ARM处理器数据处理指令中,立即数是由一个8位的常数右移循环偶数位得到,循环右移的位数由一个4位二进制的两倍表示,因此0xe3a00f41中的低12位:
f41 = 1111 0100 0001,
0100 0001表示8位常数,1111表示循环右移的位数除以2得到的值:
0100 0001的32位表示:
0000 0000 0000 0000 0000 0000 0100 0001,
循环右移1111 = 15, 15 * 2 = 30位,即循环右移30位:
0000 0000 0000 0000 0000 0001 0000 0100
即为0x104
1、数据处理指令的操作数的寻址方式
#<immediate>
<Rm>
<Rm>, LSL #<shift_imm> (Rm的数值逻辑左移shift_imm位)
<Rm>, LSL <Rs>
<Rm>, LSR #<shift_imm> (Rm的数值逻辑右移shift_imm位)
<Rm>, LSR <Rs>
<Rm>, ASR #<shift_imm> (Rm的数值算术右移shift_imm位)
<Rm>, ASR <Rs>
<Rm>, ROR #<shift_imm> (Rm的数值循环右移shift_imm位)
<Rm>, ROR <Rs>
<Rm>, RRX
2、字(32位)及无符号字节(8位)的Load/Store指令的寻址方式
基址寄存器+地址偏移量
基址寄存器:任何一个通用寄存器;
地址偏移量:立即数、寄存器、寄存器及一个移位常数;
地址计算方法:偏移量方法、事先更新方法、事后更新方法;
偏移量方法
[<Rn>, #+/-<offset_12>]
[<Rn>, +/-<Rm>]
[<Rn>, +/-<Rm>, <shift>#<shift_imm>]
事先更新方法
[<Rn>, #+/-<offset_12>]
[<Rn>, +/-<Rm>]
[<Rn>, +/-<Rm>, <shift>#<shift_imm>]
事后更新方法
[<Rn>], #+/-<offset_12>
[<Rn>], +/-<Rm>
[<Rn>], +/-<Rm>, <shift>#<shift_imm>
3、杂类Load/Store指令的寻址方式
包括:操作数为半字(无符号数、有符号数),操作数为字节(有符号数),操作数为双字(无符号数、有符号数)
LDR|STR{<cond>}H|SH|SB|D <Rd>, <addressing_mode>
addressing_mode包括:
[<Rn>, #+/-<offset_8>]
[<Rn>, +/-<Rm>]
[<Rn>, #+/-<offset_8>]!
[<Rn>, +/-<Rm>]!
[<Rn>], #+/-<offset_8>
[<Rn>], +/-<Rm>
4、批量Load/Store指令的寻址方式
LDM|STM{<cond>}<addressing_mode> <Rn>{!}, <register>{^}
指令中,寄存器和内存单元的对应关系:编号低的寄存器对应于内存中的低地址单元,编号高的寄存器对应于内存中高地址单元;
IA:increment after
IB:increment before
DA:decrement after
DB:decrement before
5、批量Load/Store指令对应于堆栈操作的寻址方式
堆栈指针指向栈顶元素时称为FULL栈;
堆栈指针指向与栈顶元素相邻的一个可用数据单元时称为EMPTY栈;
数据栈向内存地址减小的方向增长时,称为DESCENDING栈;
数据栈向内存地址增加的方向增长时,称为ASCENDING栈;
因此:
FD:full descending
ED:empty descending
FA:full ascending
EA:empty ascending
待补充...