2013年8月19日月曜日

ARMアセンブラ、LSR命令、論理右シフト

算術右シフト命令、論理左シフト命令、論理右シフト命令、右ロテート命令、および拡張付き右ロテート命令です。
これらの命令は、第 2 オペランドレジスタがシフトされる MOV 命令の同義語です。

構文

op{S}{cond} Rd, Rm, Rs
op{S}{cond} Rd, Rm, #sh
RRX{S}{cond} Rd, Rm

使用法

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,lsr #3"); #3は2の#3乗=8で、1000割る8=125


   asm("   add r0,r7,#16");
   /*asm("   mov r1,r4");*/
   asm("   bl printf");
}
akira@dynabookAZ:~/arm1308$ gcc -o 130819F 130819F.c -lm
akira@dynabookAZ:~/arm1308$ ./130819F
125
akira@dynabookAZ:~/arm1308$




0 件のコメント:

コメントを投稿