2013年8月4日日曜日

dynabook AZ(AC100)でRBIT命令を使ってみる

ARM-7でのアセンブラRBIT命令を使ってみる

RBIT命令とは、ビットの値を31<-0の順を0->31の順に
入れ替える(反転する)命令です


RBIT rx,ry

rx:入れ替えた後のレジスタ
ry:入れ替える前のレジスタ

例えば、ry=0x56e とすると

rx=0x76a00000 となる





ry=0x0000056e


31ビット          0ビット
33222222222211111111110000000000
10987654321098765432109876543210

00000000000000000000010101101110
<=  <=  <=  <=  <=




これが、rx=0x76a00000になるから、



31ビット          0ビット
33222222222211111111110000000000
10987654321098765432109876543210

01110110101000000000000000000000
=>  =>  =>  =>  =>


プログラム

#include <stdio.h>

main(){
   int i=0x56e;
   char s[10]="%x\n";

   asm("   ldrh r4,[r7,#4]");
   asm("   rbit r1,r4");
 
   asm("   add r0,r7,#8");
   asm("   bl printf");
}


プログラムの説明:

#include <stdio.h>

main(){
   int i=0x56e;  r4レジスタに入れる

iの所在位置は[r7,#4]:アセンブルして逆算

   char s[10]="%x\n";

printf("%x\n",r4); にしたいので

sの所在位置は[r7,#8]

   asm("   ldrh r4,[r7,#4]"); r4に0x56eを入れる
   asm("   rbit r1,r4");   rbit命令を使うr4の反転はr1レジスタへ
 
   asm("   add r0,r7,#8");  s[10]の内容
   asm("   bl printf");    printfをコールする
}


出力結果:

gcc -S 130804A.c -lm
gcc -o 130804A 130804A.c -lm
./130804A
76a00000
何かキーを押してください

0 件のコメント:

コメントを投稿