2016-01-01から1年間の記事一覧

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 …

courseraのMachine Learningを修了

courseraのMachine Learningを受講してたんですが、先日やっと修了できました。 courseraのMachine Learningに関してはこのページが参考になります。 数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路 - Qiita 動画には日本語字幕が付…

行列プログラマー 課題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用の言語から前の章で作成したアセンブラ言語に変換するプログラムを作成します。この章の…