ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

binary

Tail Recursion

Tail Recursion とは 末尾再帰とは、関数の最後の命令がその関数自身の呼び出しであるような再帰呼び出しのことです。バイナリアン的には、どのように最適化されるかが面白いところですので、「末尾再帰は最適化できる」というスタンスで紹介します。 最適化…

末尾呼出の最適化:tail call optimization

末尾呼出の最適化とは 末尾呼出の最適化とは、ある関数f()の最後が別の関数g()を呼び出しているだけの場合、g()の呼出をcallでなくjmpに変える最適化です。わずかですが速度とサイズの両方を改善する反面、デメリットが非常に少なく、定数畳み込みと並んで私…

関数呼び出しまとめ

5つのプロセッサで、関数呼び出しの方法をまとめました。 MIPS sparc sh ARM x86 レジスタ渡し可能な引数 4個まで 6個まで 4個まで 4個まで スタックを使用 戻り先の格納先 register register stack register stack 関数の呼出し jal call jsr bl call 関数…

関数呼び出しsh、ARM、x86編

残りのプロセッサについても、さっとまとめました。 Cソース/アセンブラはここにまとめてあります。 SH SHの場合、引数が4つまではレジスタ渡し、5つ目からスタックを使用します。 関数の呼出はjsr命令を使い、戻るときはrts命令を使います。 他のRISCプロセ…

関数呼び出しsparc編

register window Sparcプロセッサは、register windowと呼ばれる一風変わったアーキテクチャを採用しています。プロセッサ自体は、64〜528個の汎用レジスタを持っており、ソフトウェアからは32個のレジスタにアクセスできます。32個のうち24個は汎用レジスタ…

関数呼び出しMIPS編

MIPSの関数呼び出し規約を、gccを使って確認してみました。教科書によると、$4〜$7($a0〜$a3)が引数、$2〜$3($v0〜$v1)が戻り値として使われます。 元となるソース 違いを確認するために、引数が4個の関数と、引数が5個の関数を呼び出し、gccの出したアセン…

jump table

jump tableとは何か jump tableとは、アセンブラやCにおいて制御の飛び先(jump先)を配列にして並べた物です。jump tableのイメージ図はこのようになります。Cのswtich文のように、同じような条件で複数の飛び先がある場合を考えます。 int foo(int k){ int f…

Exercise 2.10 C言語のswitch文

Cのswtich文がどのようにアセンブラになるかの話。 これが教科書に載っているCのソースです。 switch (k) { case 0:f = i + j; break; /* k = 0 */ case 1:f = g + h; break; /* k = 1 */ case 2:f = g - h; break; /* k = 2 */ case 3:f = i - j; break; /*…

Exercise 2.8

このCソースがどのようなアセンブラになるかという問題 data = receiver.receivedByte; receiver.ready = 0; receiver.enable = 1;gccの出力から該当箇所を抜き出しました。 data = receiver.receivedByte; receiverの値をメモリからレジスタへ転送、右シフ…

bit field

C のbit fieldの話です。実際にどのようなコードになるかはコンパイラ依存になりますが、Cではビットフィールドが定義できます。教科書の例で行くと、 struct { unsigned int ready: 1; unsigned int enable: 1; unsigned int receivedByte: 8; }receiver;こ…

Exercise 2.7

[10] The following MIPS instruction sequence could be used to implement a new instruction that has two register operands. Give the instruction a name and describe what it does. Note that register $t0 is being used as a temporary. srl $s1, …

Exercise 2.6

Some computers have explict instructions to extract an arbitrary field from a 32-bit register and to place it in the least significant bit of a register. The figure below shows the desired operatin[Figure]Find the shortest sequence of MIPS…

自己書き換えコード

せっかく問題のNoteに、自己書き換えコードについて書いてあるのでもう少し追ってみましょう。shinhさんのところで紹介されているmain=195;が、自己書き換えコードの一例です。 MIPSでの自己書き換えコード Exercise 2.5で使われているプログラムは、最後のs…

Exercise 2.5

CD-ROMから Consider the following code used to implement the instruction sllv $s0, $s1, $s2 # which uses the least significant 5 bits of the value in register $s2 to specify the amount register $s1 should be shifted left:Add comments to th…

全部入りのbinutilsを作る。

バイナリアンへの道は遠いで悩んでいたら、shinhさんに良い方法を教わりました。http://shinh.skr.jp/m/?date=20080428#p07ありがとうございます。 ./configure --enable-targets=all --program-prefix=all- で作ると、確かに全部入りができるのですが、アー…

2章 Ex2.4 即値の減算の比較

Exercise 2.4の発展で、他のCPUも調べてみました。とは言っても各CPUのデータシートを追っていくのは大変ので、Cソースをコンパイルして必要なところを抜き出しています。やっていることは、a = b + 10, a = b - 50; で、10の加算と50の減算です。フラグ関係…

Exercise 2.2-2.4

Exercise 2.2 What binary number does this hexadecimal number represent:0x7FFF_FFFA? What decimal number does it represent? 0x7FFF_FFFAは2進で表すと、0111_1111 1111_1111 1111_1111 1111_1100。十進で表すと、2147483642。 Exercise 2.3 What hexa…

Exercise 2.1

Exercise 2.1 Using the MIPS program in Exercise 2.34 (with bugs intact), determine the instruction format for each instruction and the decimal values of each instruction field. Exercise 2.34のコードをPCspimで読み込んで、コードをダンプしま…

2章 2.9 32bit即値のロード

教科書のSection 2.9に出てくる32bit即値の話。RISCプロセッサというのは、命令長が固定な為、命令長が32bitであれば、32bitの即値をそのまま入れることはできません。クロスアセンブラの環境ができたので、早速各CPUの比較をしてみましょう。各コマンドは本…