ぐだぐだ低レベルプログラミング(12) オブジェクトファイルその2

前回は、オブジェクトファイルと言いながら、絶対番地のHEXファイルなど、ついついFlashライタでもなければ使わないようなものにフォーカスしてしまいました。今回は、心を入れ替えて(どう?)、本道のリンク可能なオブジェクトファイルを調べてみたいと思います。コンパイル、アセンブルした後のオブジェクトファイルとリンクした後の実行可能なオブジェクトファイル、例によってRaspbian上のArmの32ビットコードで見てみます。

“ぐだぐだ低レベルプログラミング(12) オブジェクトファイルその2” の続きを読む

ぐだぐだ低レベルプログラミング(11) オブジェクトファイルその1

前回、コンパイラの出力を元とするオブジェクトファイルのアセンブリリストをながめておりました。そこで現れてくるメモリアクセスを読み解くときには、セクションなる存在を無視することはできません。ただ、セクションなるもの、多面的な顔を持っていますな。全てを一度に知ろうとしても膨大すぎるかも。多分、列挙する前に速攻で忘れそうです。裏では活躍されているのでしょうが、実際、とりあえず知らんでも済むセクションの方々も多数。しかし、だいたいセクションとは何に含まれておるのかや?その在りかを知らずしてセクションの理解には至らぬであろう(本当か)。今回はその手前のオブジェクトファイルについてぐだぐだ書いてみました。 “ぐだぐだ低レベルプログラミング(11) オブジェクトファイルその1” の続きを読む

ぐだぐだ低レベルプログラミング(10) アセンブラ・リスティング

前回に引き続き、gasを用いてArmのアセンブラやっていこうと思ったのです。個別の命令をいくつか見てきたので、今回は、メモリアクセスに進もうかと。そこでちょっと魔が差しました。最初からアセンブラでサンプルを書くのではなく、gccがどんなコードを吐いているのか「参考」にさせてもらうのはいかがかと。Cであれば、大域変数、ローカル変数、単純変数、配列、構造体、いろいろあります。そういうモノどもをコンパイラはどんなコードで扱っているのか調べておこうと。でもね、その前に、大体逆アセンブルとか、メモリとか、セクションとかの調べ方押さえておかないと意味わかんなくない、ということに思い至りました。 “ぐだぐだ低レベルプログラミング(10) アセンブラ・リスティング” の続きを読む

ぐだぐだ低レベルプログラミング(9) Armらしい命令その2

前回は、Armらしい命令ということで、オペランドの取り扱いで特徴でてるじゃないかと思われるところ数点を取り上げさせていただきました。今回は、フラグですね。如何にもArmっぽいフラグの取り扱いをする命令です。 “ぐだぐだ低レベルプログラミング(9) Armらしい命令その2” の続きを読む

ぐだぐだ低レベルプログラミング(8) Armらしい命令?

前回は、.syntaxとかコメントとか、Armのアセンブリ言語をgasの上で書くときにちょっと「引っかかった」あれこれをいくつか投稿いたしました。今回は、Armのアセンブリ言語命令そのもので、ちょっと独特だな~と思った部分をメモっておきたいと思います。 “ぐだぐだ低レベルプログラミング(8) Armらしい命令?” の続きを読む

ぐだぐだ低レベルプログラミング(7) .syntax, コメント、ローカルラベル

一歩引いて眺めたら、アセンブラなんて、どのCPUでも同じようなもんだ、と思います。最初に何か一つのCPUでアセンブリ言語を覚えたら、後は以下同文的に、いろいろなCPUで書けるんじゃないでしょうか(個人の感想です)。ただ、実際にコードを書く段になると、CPU毎の違い、アセンブラ処理系のクセなど「細かい」ところが気になります。また、そこを理解しないと、やりたいことは分かっていても、実際には「どう書いたら良いかね」と手が止まってしまうもの。このところ、不慣れなArmのアセンブラに取り組んでいるので、他のCPUなどから移ってきたときにちょっと戸惑うポイントをメモって行きたいと思います。使用するアセンブラは今回は gas (コマンド名的には as )です。 “ぐだぐだ低レベルプログラミング(7) .syntax, コメント、ローカルラベル” の続きを読む

ぐだぐだ低レベルプログラミング(6) インラインアセンブラ、gccで書き換えてみれば

前回は、MbedのWeb開発環境を使ってでしたが、Arm純正のツールチェーンで、「極小」のアセンブラ記述を行ってみました。そのとき、gccのインラインアセンブラで書くならばチト面倒いかもみたいなことを書いてしまいました。そのままというのも気持ちが悪いので、今回は実際に対応するコードをRaspberry Pi 3上のgcc用に書いてコンパイルしてGo。 “ぐだぐだ低レベルプログラミング(6) インラインアセンブラ、gccで書き換えてみれば” の続きを読む

ぐだぐだ低レベルプログラミング(5)Arm組み込みアセンブラとインラインアセンブラ

前回までは、Armコアとは言え、Linuxが立派に走るCortex-A系のプロセッサ上で、GNUのツールチェーンを使い、「わずかに」アセンブラ世界の入口に到達しました。しかし、目の前に置いてある Arm Cortex-M系のプロセッサを搭載したマイコンボード共が、最近使ってないやんけ!とお怒りな気がします。今回は、ArmのWeb開発環境、Mbed Compiler を使ってマイコン上でアセンブラ書くための第1歩を踏み出してみます。ツールチェーンもArm純正、GCCとは一味違います。 “ぐだぐだ低レベルプログラミング(5)Arm組み込みアセンブラとインラインアセンブラ” の続きを読む

ぐだぐだ低レベルプログラミング(4) ARM, THUMB切り替え

前回はArmの32ビットと64ビットのモードと命令セット(機械語命令の幅は、どちらも32ビット)の件でした。Arm(腕)には、Thumb(親指)あり、今回は、32ビットモードのArmプロセッサの多くが備えるThumbという名の16ビット幅の機械語命令セットにどうやって切り替えるのか、というところを実際に動かして確認してみたいと思います。

“ぐだぐだ低レベルプログラミング(4) ARM, THUMB切り替え” の続きを読む

ぐだぐだ低レベルプログラミング(3) Arm、32ビット?64ビット?

x86は増築に増築を重ねた複雑なモードと命令セットを持っています。その昔、比較的シンプルな命令セットから出発したArmもまた、重ねた歴史の中で命令セットは複雑化してきています。それどころか、用途が幅広く、かつカスタマイズ可能なArmの方がターゲットによって使用可能な命令セットの選択範囲はx86よりバリエーションが多様にも思えます。アセンブラ書きをするにあたって、ターゲットにするボードやらOS上でどんな範囲の命令が使えるのかまず知らなければなりますまい。今回は、32ビットか、64ビットかという基本中の基本のところから調べて行きます。

“ぐだぐだ低レベルプログラミング(3) Arm、32ビット?64ビット?” の続きを読む

ぐだぐだ低レベルプログラミング(2) ラズパイでアセンブラ、最初の一歩かな?

遥かな昔、結構アセンブラ書いていた時期があるのですが、この頃(といっても多分二十年くらい前から)はあまり書かなくなりました。仕事のせいもあるけれど、多分、昔に比べたら書かなくても済むことが多いから。そのせいもあってArmには時折お世話になっておりながら、ほとんどArmでアセンブラ書いたことがありませぬ。最近、Raspberry Pi 3 model B+ を触ることが結構多く、この際、ちょっとArmのアセンブラを勉強しておこうと思い立った次第。 “ぐだぐだ低レベルプログラミング(2) ラズパイでアセンブラ、最初の一歩かな?” の続きを読む

ぐだぐだ低レベルプログラミング(1) Raspberry Pi 3, PMC利用カーネルモジュール改版

前回、Raspberry Pi 3のカーネルモジュールがビルドできるようになったので、つい嬉しくなって、ユーザモードで ArmコアのPMCCNTRレジスタを読み取れるようにするモジュールを書いてみました。しかし、マルチコアのことを棚にあげて書いたせいで、使い勝手が悪すぎました。今回は、マルチコア問題を回避しつつ、多少使いでを改良してみました。 “ぐだぐだ低レベルプログラミング(1) Raspberry Pi 3, PMC利用カーネルモジュール改版” の続きを読む