http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204gj/Cihihggj.html
4.3.12. ASR、LSL、LSR、ROR、RRX
算術右シフト命令、論理左シフト命令、論理右シフト命令、右ロテート命令、および拡張付き右ロテート命令です。
これらの命令は、第 2 オペランドレジスタがシフトされる
MOV
命令の同義語です。ASR
は、レジスタの内容を 2 のべき乗で除算した、符号付きの値を求めます。空の左のビット位置には、符号ビットがコピーされます。LSL
は、レジスタを 2 のべき乗で乗算した値を求めます。LSR
は、レジスタを 2 の可変乗で除算した、符号なしの値を求めます。いずれの命令でも、空のビット位置には 0 が挿入されます。ROR
は、レジスタの内容を任意の値でロテートした値を求めます。ロテートの結果右端から溢れたビットは、空の左のビット位置に挿入されます。RRX
は、レジスタの内容を右に 1 ビットシフトした値を求めます。古いキャリーフラグはビット [31] にシフトされます。接尾文字 S
を指定した場合、古いビット [0] がキャリーフラグに配置されます。S
が指定されている場合、これらの命令は演算結果に基づいて N と Z の各フラグを更新します。
シフト値が 0 の場合、C フラグに影響はありません。それ以外の場合、C フラグはシフトアウトされた最後のビットに更新されます。
#include <stdio.h>
main(){
char s[10]="%d\n";
int i1=1000;
int i2=3;
int i3=4;
int i4=5;
int ii;
s[0]='%';
asm(" ldr r4,[r7,#0]"); r4にi1=1000をいれる
asm(" mov r1,r4,ror #3"); 2の#3乗で8、1000割る8=125
asm(" add r0,r7,#16");
/*asm(" mov r1,r4");*/
asm(" bl printf");
}
akira@dynabookAZ:~/arm1308$ gcc -o 130819G 130819G.c -lm
akira@dynabookAZ:~/arm1308$ ./130819G
125
akira@dynabookAZ:~/arm1308$
ローテートだから、
#include <stdio.h>
main(){
char s[10]="%d\n";
int i1=1000;
int i2=3;
int i3=4;
int i4=5;
int ii;
s[0]='%';
asm(" ldr r4,[r7,#0]");
asm(" mov r1,r4,ror #20"); 1000を2の20乗で割ったら
1000を2の12乗で掛けたことと同じ(32−20=12)
2の12乗=4096、1000x4096=4096000が答え
asm(" add r0,r7,#16");
/*asm(" mov r1,r4");*/
asm(" bl printf");
}
akira@dynabookAZ:~/arm1308$ gcc -o 130819G 130819G.c -lm
akira@dynabookAZ:~/arm1308$ ./130819G
4096000
akira@dynabookAZ:~/arm1308$
#include <stdio.h>
main(){
char s[10]="%d\n";
int i1=1000;
int i2=3;
int i3=4;
int i4=5;
int ii;
s[0]='%';
asm(" ldr r4,[r7,#0]"); r4にi1=1000をいれる
asm(" mov r1,r4,ror #3"); 2の#3乗で8、1000割る8=125
asm(" add r0,r7,#16");
/*asm(" mov r1,r4");*/
asm(" bl printf");
}
akira@dynabookAZ:~/arm1308$ gcc -o 130819G 130819G.c -lm
akira@dynabookAZ:~/arm1308$ ./130819G
125
akira@dynabookAZ:~/arm1308$
ローテートだから、
#include <stdio.h>
main(){
char s[10]="%d\n";
int i1=1000;
int i2=3;
int i3=4;
int i4=5;
int ii;
s[0]='%';
asm(" ldr r4,[r7,#0]");
asm(" mov r1,r4,ror #20"); 1000を2の20乗で割ったら
1000を2の12乗で掛けたことと同じ(32−20=12)
2の12乗=4096、1000x4096=4096000が答え
asm(" add r0,r7,#16");
/*asm(" mov r1,r4");*/
asm(" bl printf");
}
akira@dynabookAZ:~/arm1308$ gcc -o 130819G 130819G.c -lm
akira@dynabookAZ:~/arm1308$ ./130819G
4096000
akira@dynabookAZ:~/arm1308$