以前に、AMD-64bit CPU用のアセンブラを試している。
今回はARMの64bit CPUのアセンブラを試してみたいと考えている。
iOSのJailbreak環境用の脱獄アプリ開発環境をインストールして、
64bit ARM(AARCH64)のバイナリを作って実機で動かすというところまで先週やってみた。
64bitのコードをJailbreakしたiPad mini Retinaで動かせることが分かったので、64bit ARM用のアセンブラを使ってマシン語のコードを直接書いてみることにする。
参考文献として32bit ARM用の「ARMで学ぶアセンブリ言語入門」という本を参考にした。
ARMで学ぶ アセンブリ言語入門(Amazon)
プロジェクトの作成方法とかビルド方法は前回と同様にした。
ソースコードmain.mmは次のように書いた。
long int addvalues(long int val1,long int val2) { long int result; __asm__ ( "ADD %[Rd],%[Rs1],%[Rs2]" : [Rd] "=r" (result) : [Rs1] "r" (val1), [Rs2] "r" (val2) ); return result; } int main(int argc, char **argv, char **envp) { long int val=addvalues(1234567890123456789L,1L); printf("addvalues = %ldn",val); return 0; }
2つの数 1234567890123456789と1を加算するというコードである。
CPUのレジスタが64bitになったので、intの代わりにlong intを使う。
詳細は先ほどの参考書を参照のこと。
make ARCHS=arm64としてビルドし、iPad mini Retina実機で実行してみた。
結果、
addvalues = 1234567890123456790
と正しく加算結果が表示された。
インラインアセンブラで64bitの数値の加算のコードがうまく動いたのが確認できた。
次に、インラインアセンブラでなく直接アセンブラのソースを記述するというのを試しているのだが、うまくいかない。
64bitのアセンブラが駄目なのかと、先ほどの参考書の32bit ARM用のアセンブラのサンプルコードをそのままというのも試したのだが、これもうまくいかなかった。アセンブリのソース ○○○.Sを記述したのをビルドして.oファイルは生成されているのだが、リンク時にその中にある関数が見つからないというエラーになってしまう。
(iOS用の開発環境でアセンブラを使う使い方について、もし情報があったらぜひ教えて下さい。)
—
追記
Android NDKのアセンブラで64bit ARMのコードを書くのができた。
→ Android NDKとNexus9を使って64bit ARMのアセンブラを試してみた