プログラム

PDP-11による機械語入門 問3

PDP-11による機械語入門 - Qiita問3-1 (defun dump-mov-n-rn (mem n) (format t "~4,'0x ~4,'0x mov $~x, r~x~%" (read16 mem *pc*) (read16 mem (+ *pc* 2)) (read16 mem (+ *pc* 2)) n) (incf *pc* 4)) (defun dump-mov-n-*rn (mem n) (format t "~4,'0x ~…

PDP-11による機械語入門 問2-2

PDP-11による機械語入門 - Qiita問2-2 (defun mov-n-r0 (mem) (setf *r0* (read16 mem (+ *pc* 2))) (incf *pc* 4)) (defun sys-exit (mem) (setf *pc* -1)) (defun sys-write (mem) (let* ((s (read16 mem (+ *pc* 2))) (len (read16 mem (+ *pc* 4))) (str…

PDP-11による機械語入門 問2-1

PDP-11による機械語入門 - Qiita問2-1 (defun load-memory (path) (with-open-file (s path :element-type '(unsigned-byte 8)) (let ((mem (make-array (file-length s) :element-type '(unsigned-byte 8)))) (read-sequence mem s) mem) )) (defun read16 …

行列プログラマー 課題0.5.1〜0.5.3

課題0.5.1 44+11*4-6/11 課題0.5.2 2304811 - (2304811 // 47) * 47 課題0.5.3 ((673 + 909) % 3) == 0

自作エミュレータで学ぶx86アーキテクチャ 3.10 条件分岐命令

https://github.com/mas454/x86emujc、jz、joなどの命令はフラグレジスタの値を元にジャンプするかどうかを 判断しています。 (define (make-jx is-flag) (lambda (emu) (if (is-flag emu) (eip-add emu (+ (get-sign-code8 emu 1) 2)) (eip-add emu 2)))) m…

自作エミュレータで学ぶx86アーキテクチャ 3.10 cmp

https://github.com/mas454/x86emu (define (cmp-r32-rm32 emu) (let ([modrm (make <modrm>)]) (parse-modrm emu modrm) (let* ([r32 (get-r32 emu modrm)] [rm32 (get-rm32 emu modrm)] [result (+ r32 (num32->2complement rm32))]) (update-eflags-sub emu r32 </modrm>…

自作エミュレータで学ぶx86アーキテクチャ 3.7 leave

https://github.com/mas454/x86emu (define (leave emu) (let ([ebp (get-register32 emu EBP)]) (set-register32 emu ESP ebp) (set-register32 emu EBP (pop32 emu)) (eip-add emu 1))) leaveはleave命令に対応している関数です。 leaveはスタックフレーム…

自作エミュレータで学ぶx86アーキテクチャ 3.7 call_rel32,ret

call-rel32とretはcall命令とret命令に対応した関数です。 (define (call-rel32 emu) (let1 diff (get-sign-code32 emu 1) (push32 emu (+ (ref emu 'eip) 5)) (eip-add emu (+ diff 5)))) (define (ret emu) (set! (ref emu 'eip) (pop32 emu))) call-rel32…

自作エミュレータで学ぶx86アーキテクチャ 3.7 push_r32、pop_r32

push-r32とpop-r32は、push命令とpop命令に対応した関数です。 (define (push-r32 emu) (let1 reg (- (get-code8 emu 0) #x50) (push32 emu (get-register32 emu reg)) (eip-add emu 1))) (define (pop-r32 emu) (let1 reg (- (get-code8 emu 0) #x58) (set-…

自作エミュレータで学ぶx86アーキテクチャ 3.7 push32,pop32

(define (push32 emu value) (let* ([esp (get-register-number 'esp)] [address (- (get-register32 emu esp) 4)]) (set-register32 emu esp address) (set-memory32 emu address value))) (define (pop32 emu) (let* ([esp (get-register-number 'esp)] [a…

自作エミュレータで学ぶx86アーキテクチャ 3.6メモ

「call メモリ番地」で現在のeipの値をスタックにプッシュし、ジャンプ先のメモリ番地をeipに 書き込む。 retはcallと対にして使う。 retはスタックから4バイトの値をポップし、その値をeipにセットする。 レジスタは少なくて引数には適さないが、戻り値は1…

自作エミュレータで学ぶx86アーキテクチャ 3.5

メモ:3.5 無条件分岐命令 jmpはeipに値を入れるだけでなく、高速化のために先読みした命令を 捨てるという役割がある。 cpuは高速化のために「パイプライン」という仕組みを持っている。 「パイプライン」は、ある命令を実行するときにはすでに何命令も 先…

自作エミュレータで学ぶx86アーキテクチャ 3.4

自作エミュレータで学ぶx86アーキテクチャ 3.4のプログラム完成しました。 githubにソースコードを置いています。 GitHub - mas454/x86emu

自作エミュレータで学ぶx86アーキテクチャ 3.2

(use gauche.uvector) (define-class <registers> () ((eax :init-keyword :eax :init-value 0) (ecx :init-keyword :ecx :init-value 0) (edx :init-keyword :edx :init-value 0) (ebx :init-keyword :ebx :init-value 0) (esp :init-keyword :esp :init-value 0) (ebp</registers>…

自作エミュレータで学ぶx86アーキテクチャ 2.3

自作エミュレータで学ぶx86アーキテクチャを読んでます。 この本ではあらかじめc言語で書かれているエミュレータのプログラムを元に 解説していくのですが、理解を深めるためにgaucheでエミュレータを作成しています。 (use gauche.uvector) (define-class <registers> </registers>…

コンピュータシステムの理論と実装12章

コンピュータシステムの理論と実装12章では、10章と11章で作ったjack言語を使って osを作ります。osといっても本格的なものではなく、メモリ管理やスクリーンに文字やグラフィックを表示したり する低レベルな部分を担当するライブラリという感じなのですが…

コンピュータシステムの理論と実装11章

コンピュータシステムの理論と実装11章のコンパイラ完成しました。 (use file.util) (use sxml.serializer) (define symbol-table (let [(ctable '()) (stable '()) (static-index 0) (field-index 0) (argument-index 0) (var-index 0) (class-name '()) (s…

コンピュータシステムの理論と実装10章

コンピュータシステムの理論と実装10章のパーサ完成しました。 10章と11章では、Jack言語というこの本のオリジナル言語のコンパイラを 作ります。10章では、パーサの部分を作成します。jack-analyzerにファイルかディレクトリのパスを渡せば、パース…

8章のVM変換器完成

コンピュータシステムの理論と実装8章のVM変換器完成しました。 7章で作ったものに、関数の定義をできるようにしたり、goto文などを追加しています。 (use file.util) (define (read-vfile file) (call-with-input-file file (lambda (i) (let loop ((c (r…

7章のVM変換器完成

コンピュータシステムの理論と実装7章のVM変換器完成しました。 vmtranslator関数に.vmファイルか、.vmファイルのあるフォルダの パスの文字列を渡せば、asmファイルに変換されます。 (use file.util) (define (read-vfile file) (call-with-input-file fil…

vm変換器作成中

いま、コンピュータシステムの理論と実装7章のVM変換器を作成しています。 VM自体はこの本の中では実装しませんが(この本のサイトからダウンロードできます。)、 VM用の言語から前の章で作成したアセンブラ言語に変換するプログラムを作成します。この章の…

アセンブラ完成

コンピュータシステムの理論と実装8章のシンボルも処理できるアセンブラ 完成しました。 前のプログラムから追加した部分の説明を書いておきます。プログラムを読み込んだら、最初にラベルの処理をします。 (define (assem-label1 lis n result) (cond ((nu…

プログラミングの基礎:8.1〜8.3

8.1 レコードの必要性 レコードとは名前のついたデータの集まりである 8.2 レコードの構文 レコードの構文 { 名前1 = 値1 ; 名前2 = 値2; ・・・ }レコードの中で使う名前をフィールドと呼ぶ。レコードの例 { name = "asai" ; tensuu = 70; seiseki = "B" }…

コードリーディング:1.1.4進化

他人が書いたプログラムに新しい機能を追加する場合、最初にすべきことは 類似した機能が書かれている部分を探し出して、それを追加したい機能の テンプレートにすることである。

プログラミングの基礎:7.3 構造データに対するデザインレシピ

構造を持つデータを扱うときにはデザインレシピの4項目に 新しい項目「テンプレート」を「本体」の前に加える。入力が構造データの場合は、その中身を取り出すmatch文を作る入力データの型が定まるとそこから必然的に決まってくる関数本体の形 のことをテン…

プログラミングの基礎:7.2パターンマッチ

複数のデータからできているデータの中身を取り出すには パターンマッチを使う。 match 式 with パターン -> 式例 match (3, 5) with (a, b) -> a + b (a, b)が値の組を表すパターンで、ここにでてくるaとbをパターン変数と呼ぶ。 上の例では(3, 5)が(a, b)…

プログラミングの基礎:7.1 組の構文

組とはいくつかのデータを並べてひとつのデータにしたものである。 以下のように表現する (3.14, 2.71) 組の型は要素の型を*でつないだものになる。 例えば上の(3.14, 2.71)の型は float * float になる。組は違う型の要素をならべてもかまわない。 (3,true)…

プログラミングの基礎:問題5.4〜5.6解答

(* 問題5.4 *) (* 目的: 2次方程式の係数a,b,cが与えられたら判別式の値を返す *) (* hanbetsushiki : float -> float -> float -> float *) let hanbetsushiki a b c = b ** 2.0 -. 4.0 *. a *. c (* テスト *) let test1 = hanbetsushiki 1.0 5.0 4.0 = 9.…

プログラミングの基礎:問題5.2解答

(* 目的 :受け取った時間xが午前か午後かを計算する *) (* jikan : int -> string *) let jikan x = if x >= 12 then "午後" else "午前" (* テスト *) let test1 = jikan 0 = "午前" let test2 = jikan 12 = "午後" let test3 = jikan 13 = "午後"

コンピュータシステムの理論と実装:シンボルフリー版のアセンブラ完成

シンボルフリー版のアセンブラ完成しました。 簡単にプログラムの説明を書いておきます。 A=1 M=Dと書かれたファイルがあるとする。 このファイルをread-asmで読み込むと ("A=1" "M=1")のようなリストが返されます。 その次に1個ずつ要素を、string->list関…