AAE
先週の中頃、こんなものが送られてきました。 FAQ にあるとおり、メールで認定書を要求することができます。 そのメール送付の翌日に、メールにて 419x565 ピクセルの AAEロゴ の Jpegファイルが添付されてきました。なので、認定書はその Jpeg 画像の…
Thumb-2 の If-Then 命令を試したくて下記のコードをコンパイルするも、オプションで Thum(-2)を指定するとエラーになります。 ファイル名:"it.s" .text .global _start _start: mov r0, #0 cmp r0, #0 itte eq mvneq r1, r1 mvneq r2, r2 mvnne r3, r3 mov…
末尾が X のブランチ命令 BLX (Branch with Link and eXchange) BX (Branch and eXchange) では ARM <--> Thumb モードの切替ができます。 BLX/BX ともにレジスタあるいはラベルをオペランドに指定できますが、ARM Compiler toolchain Assembler Reference …
以前書いたブログで VMRS APSR_nzcv, FPSCR という命令を試したことがありましたが、このターゲットになっている APSR_nzcv が何者なのかが気になっていました。 クロスコンパイラのディレクトリを find と grep で徹底的に調べても定義らしき記述はヒットし…
CPS の仕様はプログラマーズガイド(ARM DEN0013C)の記述だけでは今ひとつピンときませんでした。ウェブ検索して infocenter.arm.com でヒットしたコード(下記)を見てやっと理解できました。 .text .global _start _start: cpsie if @ enable IRQ and FIQ c…
いよいよ試験予定日の週に突入してしまいました ということで、ARM認定エンジニア認定資格のサイトを改めて見直してみました。 とりあえず、AAE Learning Resources に掲載されている資料の内容も含めて、ARMv7 が対象であることは変わっていないようです。…
MRC (Move to Register from Coprocessor) を使ってみました。 .text .global _start _start: mrc p10, 7, r0, c1, c0, 0 bl writeHEX32 vmrs r0, FPSCR bl writeHEX32 vcmp.f32 s0, s0 mrc p10, 7, r0, c1, c0, 0 bl writeHEX32 vmrs r0, FPSCR bl writeHEX…
Cortex-A Series Version: 3.0Programmer’s GuideARM DEN0013C (ID071612) の Appendix B NEON and VFP Instruction Summary を一覧表にまとめてみました。 Perlスクリプトで情報を抜き出したのですが、うまく抜き出せないところが多々あり、手で情報をコピ…
ARM認定エンジニア認定資格 の試験を 1/30(木)に受験する予定で、ARMのアセンブラを弄って勉強しています。しかし、このまま思いつくままのやり方では試験要綱へのカバー範囲が偏るのが心配(汗) 。。。ということで、 Cortex-A Series Version: 3.0Programme…
昨日に引き続き、京都マイクロコンピュータさんのブログ記事 ARMのNEONのSIMD命令をgccのオートベクタライズの最適化で使う方法 に掲載されていることを再実行してみました。 ここで使うクロスコンパイラは毎度お馴染みのこれ↓です。 $ arm-xilinx-linux-gnu…
京都マイクロコンピュータさんのブログ記事 ARMのNEONのSIMD命令をgccのオートベクタライズの最適化で使う方法 に掲載されていることを再実行してみました。 違うのはクロスコンパイラのバージョンだけ。 私のはいつものこれ↓です。 $ arm-xilinx-linux-gnue…
Cortex-A プログラマーズガイド (DEN0013C) の Example 7-1 にあったサンプルコード VCMP d0, d1 VMRS APSR_nzcv, FPSCR BNE label を試してみました。 下記が実際に動かしたコードです。 .text .global _start _start: VCMP.F64 d0, d1 VMRS APSR_nzcv, FPS…
Hellow World! 出力はあらかじめ決まった文字列の表示でした。今回は一歩進んで、レジスタ r0 の内容を 16進数表示するサブルーチンを作りました。 レジスタ r0 に格納された情報を 4ビットずつシフトしながら文字列に変換して write システムコールで標準…
これまでは C言語にインラインでアセンブラを組み込んで動かしていました。 今回はアセンブラのみのコードで、”Hello, World!” を表示します。 コードは ‘Hello World!’ in ARM assembly をほぼそのままコピーさせてもらいました いちおう、swi を svc に置…
main() から関数 kakeruni() をコールする C ソースをコンパイルしてアセンブラを観察してみました。 まず、C ソースは下記の通りです。 このコンパイル結果のアセンブラです。 main() および kakeruni() ともに数字で分類したような処理内容になっているよ…
昨日の簡単な関数 kakeruni (掛ける2) を戻り値を使うように変更しました。 変更した箇所を赤で強調しています。 main.c #include <stdio.h> extern int kakeruni(int b); int main(int argc, char *argv[]){ int v; v = atoi(argv[1]); printf("%d\n", v); v = kake</stdio.h>…
アセンブラをC言語コードから呼び出す小さいサンプルを作ってみました。 main.c #include <stdio.h> extern void kakeruni(int *a, int b); int main(int argc, char *argv[]){ int v; v = atoi(argv[1]); printf("%d\n", v); kakeruni(&v, v); printf("%d\n", v); re</stdio.h>…
浮動小数点の扱い方として、ハードウェア浮動小数点コプロセッサがあるのと無いのとで違いがあるのは分かりやすいです。さらに、コプロセッサがある場合には、値の受け渡しに使うレジスタが「通常」か「浮動小数点」かの違いで「浮動小数点リンケージ」なる…
もっとも基本的な積算命令は MUL ですが、これに加算や減算が合わせて実行される命令(MLA, MLS)とか演算結果が64-bit対応の命令(SMAL,SMULL, UMLAL, UMULL)があります。 Cで簡単な関数を書いてコンパイル結果に MLA, MLS, SMULL, UMULL が使われることを確認…
アセンブラのプログラミング経験が皆無なので、とにかく簡単なプログラムを組んでみました。4つの整数についてソート、合計、平均、範囲を求めるプログラムです。 #include <stdio.h> int main(int argc, char *argv[]) { register int v0; register int v1; registe</stdio.h>…
Cortex-A Series プログラマーズガイド (DEN0013C) を精読せずいい加減に読んでると、最後のオペランド (つまり operand2) はバリエーションがたくさんあって手強いという印象を持ちました。 たとえば、以下のようなオペランドが例として記載されていまし…
Cortex-A プログラマーズガイド(ARM DEN0013C)によると、アセンブラで扱える定数は 8-bit 定数を右に4-bit値(0-15)*2bit ローテートした値 だそうです。例えば、0xFF とか 0xFF000000 など。 それとは別に、MOVW/MOVT の2命令を使うと任意の32bit値も扱…
ARM認定エンジニア プログラム (AAE) にチャレンジすることにしました 今月30日の試験をすでに申し込んでいます 試験時間は80分で、結果は終了時にすぐ分かるとのことです。サンプルテストは4択でしたので、4択をひたすら解いて回答をPCに入力するもの…