2014年2月24日月曜日

ARMでアセンブリ

"ARMで学ぶアセンブリ言語入門"(http://www.amazon.co.jp/dp/4863541260/)という本があります
タイトル通り、ARMマイコン上で走るアセンブリを学ぶための本です

4章の最初のあたりまで読んで後は放置していたのですが、それじゃもったいないので、せめて実機で走らせるくらいはしてみよう ということで遊んでみました

とりあえず手持ちのARMマイコンといえばSTM32F103くらいなので、このコードの上にデクリメントと条件分岐だけのコードを書いて、プログラムループのディレイとして遊びました

で、さすがにこれだけで終わるのもアレなので ARMマイコンを使用しているRaspberry Piでも試してみました

コード
      1 #include <stdio.h>
      2
      3 int main(void) {
      4     int var1 = 10, var2;
      5
      6     __asm__ (
      7         "    MOV     r0, #2               \n\t"
      8         "    MUL     %[Rw], %[Rr], r0     \n\t"
      9         : [Rw] "=r" (var2)
     10         : [Rr] "r"  (var1)
     11         : "r0"
     12     );
     13
     14     printf("%d\n", var2);
     15
     16     return(0);
     17 }
     18

こんな感じです
期待する出力は20です
まず入力としてvar1で10を与え、中でまずr0に2をロードしてからvar2にvar1*r0で 20になるはずです

で、
 $ gcc main.c
でビルドし
 $ ./a.out
で起動すると 期待したとおり20と表示して終了します

以上、ARMマイコン上で動作するアセンブリのテストでした



だけだとさすがに怒られると思うので、もう一つ試してみたいと思います

Nexus7です
RasPiと同じコードで同じように動作しました

ARMのアセンブリは様々な環境で動作するので、もうちょっと深みにハマっても面白そうだと思います


P.S.
デスクトップ版のARM版Ubuntuの13.10のアップデートが来ていました(今のバージョンは上記画像の通り13.04)
IntelCPU向けはかなり前に出ていたので、やっとか という感じですが
近いうちにアップデートしてみようと思います
やったら起動しなくなりました
とりあえず13.04に戻しています

それとARM版13.04でChromiumが動くようになっていました
あいかわらずFlashは無く、ChromiumでもFlashのエミュレートはできないので某Flashゲーはできませんが

0 件のコメント:

コメントを投稿