2013年8月19日月曜日

ARMアセンブラ、ROR命令右ローテート

算術右シフト命令、論理左シフト命令、論理右シフト命令、右ロテート命令、および拡張付き右ロテート命令です。
これらの命令は、第 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,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$

イラストロジック、ミュシャの椿姫です


イラストロジック、アンコールワットです


イラストロジック、七五三です


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$




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$

ARMアセンブラ、算術右シフトASR命令

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

   asm("   mov r1,r4,asr #6"); 2の#6乗は64で、256割る64は4。r1の答えは4である

   asm("   add r0,r7,#16");
   /*asm("   mov r1,r4");*/
   asm("   bl printf");
}


akira@dynabookAZ:~/arm1308$ gcc -o 130819D 130819D.c -lm
akira@dynabookAZ:~/arm1308$ ./130819D
4     ←こたえ
akira@dynabookAZ:~/arm1308$ 







armアセンブラ、掛け算命令MLS

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204gj/Cihihggj.html

MUL{S}{cond} Rd, Rm, Rs
MLA{S}{cond} Rd, Rm, Rs, Rn
MLS{cond} Rd, Rm, Rs, Rn



MUL 命令は Rm と Rs の値を乗算し、演算結果の下位 32 ビットを Rd に返します。
MLA 命令は Rm と Rs の値を乗算し、Rn の値を加算して、演算結果の下位 32 ビットを Rd に返します。
MLS 命令は Rm と Rs の値を乗算し、その結果を Rn の値から減算して、最終的な演算結果の下位 32 ビットを Rd に返します。



#include <stdio.h>

main(){
   char s[10]="%d\n";
   int i1=2;
   int i2=3;
   int i3=4;
   int i4=5;
   int ii;
   
   s[0]='%';
   asm("   ldr r4,[r7,#0]");  r4←i1=2
   asm("   ldr r5,[r7,#4]");  r5←i2=3
   asm("   ldr r6,[r7,#8]");  r6←i3=4
   asm("   ldr r8,[r7,#12]");  r8←i4=5

   asm("   mls r4,r5,r6,r8");  掛け算 r4←r8-r5xr6=5-3x4=5-12=-7

   asm("   add r0,r7,#16");  printf(s,r1);
   asm("   mov r1,r4");
   asm("   bl printf");
}


akira@dynabookAZ:~/arm1308$ gcc -o 130819C 130819C.c -lm
akira@dynabookAZ:~/arm1308$ ./130819C
-7
akira@dynabookAZ:~/arm1308$ 




armアセンブラ、掛け算命令MLA

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204gj/Cihihggj.html

MUL{S}{cond} Rd, Rm, Rs
MLA{S}{cond} Rd, Rm, Rs, Rn
MLS{cond} Rd, Rm, Rs, Rn



MUL 命令は Rm と Rs の値を乗算し、演算結果の下位 32 ビットを Rd に返します。
MLA 命令は Rm と Rs の値を乗算し、Rn の値を加算して、演算結果の下位 32 ビットを Rd に返します。
MLS 命令は Rm と Rs の値を乗算し、その結果を Rn の値から減算して、最終的な演算結果の下位 32 ビットを Rd に返します。



#include <stdio.h>

main(){
   char s[10]="%d\n";
   int i1=2;
   int i2=3;
   int i3=4;
   int i4=5;
   int ii;
   
   s[0]='%';
   asm("   ldr r4,[r7,#0]");  r4←i1=2
   asm("   ldr r5,[r7,#4]");  r5←i2=3
   asm("   ldr r6,[r7,#8]");  r6←i3=4
   asm("   ldr r8,[r7,#12]");  r8←i4=5

   asm("   mul r4,r5,r6,r8");  掛け算 r4←r5xr6+r8=3x4+5=12+5=17

   asm("   add r0,r7,#16");  printf(s,r1);
   asm("   mov r1,r4");
   asm("   bl printf");
}


akira@dynabookAZ:~/arm1308$ gcc -o 130819B 130819B.c -lm
akira@dynabookAZ:~/arm1308$ ./130819B
17
akira@dynabookAZ:~/arm1308$ 



armアセンブラ、掛け算命令MUL

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204gj/Cihihggj.html

MUL{S}{cond} Rd, Rm, Rs
MLA{S}{cond} Rd, Rm, Rs, Rn
MLS{cond} Rd, Rm, Rs, Rn



MUL 命令は Rm と Rs の値を乗算し、演算結果の下位 32 ビットを Rd に返します。
MLA 命令は Rm と Rs の値を乗算し、Rn の値を加算して、演算結果の下位 32 ビットを Rd に返します。
MLS 命令は Rm と Rs の値を乗算し、その結果を Rn の値から減算して、最終的な演算結果の下位 32 ビットを Rd に返します。



#include <stdio.h>

main(){
   char s[10]="%d\n";
   int i1=2;
   int i2=3;
   int i3=4;
   int i4=5;
   int ii;
   
   s[0]='%';
   asm("   ldr r4,[r7,#0]");  r4←i1=2
   asm("   ldr r5,[r7,#4]");  r5←i2=3
   asm("   ldr r6,[r7,#8]");  r6←i3=4
   asm("   ldr r8,[r7,#12]");  r8←i4=5

   asm("   mul r4,r5,r6");  掛け算 r4←r5xr6=3x4=12

   asm("   add r0,r7,#16");  printf(s,r1);
   asm("   mov r1,r4");
   asm("   bl printf");
}


akira@dynabookAZ:~/arm1308$ gcc -o 130819A 130819A.c -lm
akira@dynabookAZ:~/arm1308$ ./130819A
12
akira@dynabookAZ:~/arm1308$ 


2013年8月18日日曜日

イラストロジック、ゴールデン・ゲート・ブリッジです


イラストロジック、スターウォーズです


イラストロジック、弁慶と牛若です


素因数分解プログラム


akira@dynabookAZ:~$ cd arm1304
akira@dynabookAZ:~/arm1304$ gcc -o b012 b012.c -lm
akira@dynabookAZ:~/arm1304$ ./b012
Favorite Number: 45
45=3*3*5
46=2*23
47=47
48=2*2*2*2*3
49=7*7
50=2*5*5
51=3*17
52=2*2*13
53=53
54=2*3*3*3
55=5*11
56=2*2*2*7
57=3*19
58=2*29
59=59
60=2*2*3*5
akira@dynabookAZ:~/arm1304$ ./b012
Favorite Number: 123456789
123456789=3*3*3607*3803
123456790=2*5*37*333667
123456791=123456791
123456792=2*2*2*3*59*87187
123456793=157*786349
123456794=2*19*113*28751
123456795=3*5*7*11*89*1201
123456796=2*2*30864199
123456797=73*1691189
123456798=2*3*3*3*3*769*991
123456799=29*4257131
123456800=2*2*2*2*2*5*5*154321
123456801=3*13*23*137633
123456802=2*7*61*144563
123456803=123456803
123456804=2*2*3*10288067
akira@dynabookAZ:~/arm1304$



#include <stdio.h>

main(){
   long a,b,c,m,s,i;
   char s1[20]="%s";
   char s2[20]="Favorite Number: ";
   char s3[20]="%ld\n";
   char s4[20]="%ld*";
   char s5[20]="%ld=";
   char s6[20]="%ld";
   char s7[20]="Kake Over\n";
   char s8[20]="Number Over\n";

   printf(s1,s2);
   scanf(s6,&a);

   if(a>=0x7ffffff0) b=0x7ffffffe;
   else              b=a+15;

   for(m=a; m<=b; m++){
      s=m;
      printf(s5,s);
      i=2;
      while(i<=s){
         if(s<i*i){
            printf(s3,s);
            goto F1;
         }
         if(s%i==0){
            s/=i;
            printf(s4,i);
            i=2;
         }
         else{
            if(i==2) i++;
            else     i+=2;
            if(i>=0x0000b504){
               printf(s1,s7);
               goto F1;
            }
         }
      }
F1:i=i;

      if(m>=0x7ffffffe){
         printf(s1,s8);
         return;
      }
   }
}

2013年8月14日水曜日

日数計算プログラム

akira@dynabookAZ:~$ cd arm1304
akira@dynabookAZ:~/arm1304$ gcc -o b014 b014.c -lm
akira@dynabookAZ:~/arm1304$ ./b014
now example:> 20130403:> 20130806
old example:> 19020101:> 19450806
Answer Days: 24837
akira@dynabookAZ:~/arm1304$


「あの」日から68年後の日数は24837日なのか



#include <stdio.h>

long daysA();

main(){

   char s1[30]="now example:> 20130403:> ";
   char s2[30]="old example:> 19020101:> ";
   char s3[30]="Answer Days: %ld\n";
   char s4[30]="%s";
   long a1,a2,a3;

   printf(s4,s1); a2=daysA();
   printf(s4,s2); a3=daysA();

   a1=a2-a3;
   printf(s3,a1);
}

long daysA(){

   long l,l1,yy,mm,dd;
   long mm1[15]={0,0,31,59,90,120,151,
                 181,212,243,273,304,334,365,396};
   char d1[15]="%s";
   char d3[15]="a=%ld\n";
   char d2[30]="                    ";

   scanf(d1,d2);
   yy=(d2[0]-48)*1000+(d2[1]-48)*100+(d2[2]-48)*10+(d2[3]-48);
   mm=(d2[4]-48)*10+(d2[5]-48);
   dd=(d2[6]-48)*10+(d2[7]-48);

   /*printf(d3,yy);*/

   if(mm>=3){
      l1=yy-1900;
      l =l1*365+mm1[mm]+dd+l1/4;
   }
   else{
      l1=yy-1901;
      l =l1*365+mm1[mm+12]+dd+l1/4;
   }
   return l;
}


イラストロジック、テキサスです


イラストロジック、電車です


2013年8月12日月曜日

イラストロジック、答えはワンピースです


イラストロジック、答えはフランスです


FFT(Fast Fourier Trasform)フーリエ変換の計算pie12.c

1200の自乗は1440000の計算


akira@dynabookAZ:~/pie$ gcc -o pie12 pie12.c -lm
akira@dynabookAZ:~/pie$ ./pie12
キーを押してください
0 0.000000 0.000000
1 0.000000 0.000000
2 2.000000 0.000000
3 1.000000 0.000000
4 0.000000 0.000000
5 0.000000 0.000000
6 0.000000 0.000000
7 0.000000 0.000000
8 0.000000 0.000000
9 0.000000 0.000000
10 0.000000 0.000000
11 0.000000 0.000000
12 0.000000 0.000000
13 0.000000 0.000000
14 0.000000 0.000000
15 0.000000 0.000000

0 0.000000 0.000000
1 0.000000 0.000000
2 0.000000 0.000000
3 -0.000000 0.000000
4 4.000000 0.000000
5 4.000000 -0.000000
6 1.000000 0.000000
7 0.000000 0.000000
8 0.000000 0.000000
9 -0.000000 -0.000000
10 -0.000000 0.000000
11 -0.000000 0.000000
12 0.000000 0.000000
13 -0.000000 0.000000
14 -0.000000 0.000000
15 0.000000 0.000000
time=0.047471
akira@dynabookAZ:~/pie$






#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <term.h>
#include <curses.h>
#include <math.h>
#include <time.h>

#define  P   4
#define  N   16

double f1[N+4],f2[N+4];

void  fft(double ff1[N+4],double ff2[N+4],int vec);
void a2(  double ff1[N+4],double ff2[N+4]);

static struct termios initial_settings, new_settings;
static int peek_character = -1;

void init_keyboard();
void close_keyboard();
int kbhit();
int readch();
double gettime();

double st1,pt1;
float tt1=0.0;
double w[N+N+4];
int n2=N>>1,n4=N>>2,n8=N>>3;

void  fft(double ff1[N+4],double ff2[N+4],int vec){
   int i,j,k,ik,h,d,k2;
   double t,s,c,dx,dy;

   j=0;
   for(i=0;i<=N-2;i++){
      if(i<j){
         t=ff1[j]; ff1[j]=ff1[i]; ff1[i]=t;
         t=ff2[j]; ff2[j]=ff2[i]; ff2[i]=t;
      }
      k=n2;
      while(k<=j){
         j-=k;k>>=1;
      }
      j+=k;
   }


   for(k=1;k<N; k=k2){
      h=0; k2=k+k; d=N/k2;
      for(j=0;j<k;j++){
         c=w[h+n4];
         if(vec!=-1) s=w[h];
         else              s=-w[h];
         for(i=j;i<N;i+=k2){
            ik=i+k;
            dx=s*ff2[ik]+c*ff1[ik];
            dy=c*ff2[ik]-s*ff1[ik];
            ff1[ik]=ff1[i]-dx; ff1[i]+=dx;
            ff2[ik]=ff2[i]-dy; ff2[i]+=dy;
         }
         h+=d;
      }
   }
   if(vec==-1){
      for(j=0;j<N;j++){
         ff1[j]/=N;
         ff2[j]/=N;
      }
   }
}

void  a2(double ff1[N+4],double ff2[N+4]){
   double gg1,gg2;
   int j;

   for(j=0;j<N;j++){
      gg1=ff1[j]*ff1[j]-ff2[j]*ff2[j];
      gg2=2*ff1[j]*ff2[j];
      ff1[j]=gg1;
      ff2[j]=gg2;
   }
}

int main()
{
   int ch=0,i,j;
   long cnt;
   double c,s,dc,ds,t;

   init_keyboard();
   printf("キーを押してください\n");

   st1=gettime();

      f1[2]=2.0;
      f1[3]=1.0;
      for(j=0;j<N;j++) printf("%d %6.6f %6.6f\n",j,f1[j],f2[j]);
      printf("\n");

   t=sin(M_PI/N);
   dc=2*t*t; ds=sqrt(dc*(2-dc));
   t=2*dc; c=w[n4]=1; s=w[0]=0;
   for(i=1;i<n8;i++){
      c-=dc; dc+=t*c;
      s+=ds; ds-=t*s;
      w[i]=s;
      w[n4-i]=c;
   }
   if(n8!=0) w[n8]=sqrt(0.5);
   for(i=0;i<n4;i++)    w[n2-i]=w[i];
   for(i=0;i<n2+n4;i++) w[i+n2]=-w[i];

   cnt=0;
   while(ch != 'q'&&cnt<100) {
      for(j=0;j<N;j++){
         f1[j]=f2[j]=0.0;
      }
      f1[2]=2.0;
      f1[3]=1.0;

      fft(f1,f2,1);
      a2( f1,f2);
      fft(f1,f2,-1);

      if(kbhit()) {
         ch = readch();
         printf("you hit %X : %c\n",ch,ch);
      }
      cnt++;
   }
   for(j=0;j<N;j++) printf("%d %6.6f %6.6f\n",j,f1[j],f2[j]);

   pt1=(gettime()-st1)+tt1;
   printf("time=%6.6f\n",pt1);

    close_keyboard();
}

void init_keyboard()
{
    tcgetattr(0, &initial_settings);
    new_settings = initial_settings;
    new_settings.c_lflag &= ~ICANON;
    new_settings.c_lflag &= ~ECHO;
    new_settings.c_lflag &= ~ISIG;
    new_settings.c_cc[VMIN] = 0;
    new_settings.c_cc[VTIME] = 0;
    tcsetattr(0, TCSANOW, &initial_settings);
}

void close_keyboard()
{
    tcsetattr(0, TCSANOW, &initial_settings);
}

int kbhit()
{
    char ch;
    int nread;

    if(peek_character != -1)
        return 1;
    new_settings.c_cc[VMIN]=0;
    tcsetattr(0, TCSANOW, &new_settings);
    nread = read(0, &ch, 1);
    new_settings.c_cc[VMIN]=1;
    tcsetattr(0, TCSANOW, &new_settings);

    if(nread == 1) {
        peek_character = ch;
        return 1;
    }
    return 0;
}


int readch()
{
    char ch;

    if(peek_character != -1) {
        ch = peek_character;
        peek_character = -1;
        return ch;
    }
    read(0, &ch, 1);
    return ch;
}


double gettime(){
   struct timeval tv;
   gettimeofday(&tv,NULL);
   return tv.tv_sec+(double)tv.tv_usec*1e-6;
}

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
何かキーを押してください