2016-08-01から1ヶ月間の記事一覧

自作エミュレータで学ぶ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