ぱたへね

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

mips

The RISC-V Reader: An Open Architecture Atlas

パターソン先生の動画を見て、これは読まねばならぬと思い読んでみました。 https://www.amazon.com/RISC-V-Reader-Open-Architecture-Atlas/dp/0999249118/ Amazon.co.jpでは取り扱ってないけど、.comでは普通に買えます。不当に高いのをつかまないように。…

RISCマシーンのデータパス

LispマシーンCADRのデータパスを調べているうちに、他のプロセッサのデータパスも整理したくなったので、まとめてみました。データパス(datapath)とは、プロセッサに限らず、デジタル回路のデータ処理を図にするときに、どこからデータが入ってきて、どこに…

PowerPC

In More DepthにPowerPCの特徴が書いてあったのでまとめました。PowerPCはMIPSに近いアーキテクチャを持っています。一番の違い(The primary difference)は、2つの追加のアドレッシングモードと、いくつかの命令です。 Indexed Addressing と Update Address…

Exercise 2.22 MIPS Coding and ASCII Strings その2

2.22 [20] Write a procedure, bcount, in MIPS assembly language. The bcount procedure takes a single argument, which is a pointer to a string in register $a0, and it returns a count of the total number of b characters in the string in regis…

Exercise 2.21 MIPS Coding and ASCII Strings

[30] Write a program in MIPS assembly language to convert an ASCII decimal string to an integer. Your program should expect register $a0 to hold the address of a null-terminated string containing some combination of the digits 0 through 9.…

Exercise 2.20

null-terminate された文字列"A byte is 8 bits"のバイト数を求めなさい。 16文字+nullなので、合計17バイトになります。コンパイラを使って確認してみましょう char s[] = "A byte is 8 bits"; をsde-gccでコンパイルすると、こうなります。 .file 1 "c.c"…

Exercise 2.19

IrisとJulieの名前を、ASCIIとUnicode(Basic Laten character set)で表現しなさい。 テキストエディタで書いて、各文字コードで保存、バイナリエディタで覗いてみたら簡単にわかります。 ASCII Iris 49 72 69 73 Julie 4A 75 6C 69 65 UTF-8 Iris 49 72 69 7…

Exercise 2.16-2.18 Fibonacci number

フィボナッチ数を、再帰バージョンと末尾再帰バージョンにしたときの比較です。SICPの1.2.2 Tree Recursionと全く同じ問題ですね。 http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.2 再帰バージョン iint fib(int n){ if (n == 0)…

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 関数…

関数呼び出しMIPS編

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

Exercise 2.13 control flow graph

このプログラムのcontrol flow graphを書きなさい。 for(i=0;i

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…

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の比較をしてみましょう。各コマンドは本…

クロス環境の構築

適当に各プロセッサのCコンパイラを揃えてみました。勉強に使う分には十分だと思います。Cygwinがインストールしてあることが前提です。CQ出版のCDにも体験版などが入っているのですが、気軽にダウンロードできること、Optionが統一されているの理由でgcc系…

2章 mips シミュレータの準備

Exercise 2.1 をする前準備 exercise 2.34のバグ付きプログラムを使って、各命令についてフォーマットと、10進の値を確認しなさい。まじめにやろうとするとアセンブラが必要なんですが、mipsシミュレータでさくっと確認しましょう。 手順を簡単にまとめまし…