2013年8月19日月曜日

ARMアセンブラ、LSL命令

算術右シフト命令、論理左シフト命令、論理右シフト命令、右ロテート命令、および拡張付き右ロテート命令です。
これらの命令は、第 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=100;
   int i2=3;
   int i3=4;
   int i4=5;
   int ii;
 
   s[0]='%';
   asm("   ldr r4,[r7,#0]");  r4=i1=100

   asm("   mov r1,r4,lsl #6"); 2の6乗=64倍 100x64=6400

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

0 件のコメント:

コメントを投稿