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 件のコメント:
コメントを投稿