てきとうなさいと べぇたばん

コンピュータシステムの理論と実装 機械語

キーボードを何も押していない状態。右側のスクリーンは真っ白である。 なんかキーを押した状態。画面が黒くなる。

機械語

仕様によって定められた形式に従い、プロセッサほかレジスタなどを用いてメモリを操作する。

ニーモニックからアセンブリへ

ただし、0111101000101101とか言われても人間にはわかりにくいので、ニーモニックを使って命令を把握する。どんどん命令をニーモニックに変換していくと、ニーモニックからバイナリへ変換するプログラムを書けばいいんじゃね?となる。これがアセンブリ言語である。

あと4章で語られていることはたくさんあるけど、まぁ、各自読んでねー。

4章のプロジェクト

Mult.asmとFill.asmの2つのプログラムを書くように要求される。ぶっちゃけ慣れだ!頑張れ!

Fill.asm

Mult.asmは別にどうってことはない。躓いたのがFill.asmである。何故かRAM[16384]に-1(1111111111111111)を入れても1ピクセルの横棒にならずに黒いドットが表示されているだけだった。

さすがにこれおかしいだろと思って調べると、原因はJDKのバージョンにあった。http://nand2tetris-questions-and-answers-forum.32033.n3.nabble.com/screen-memory-mapping-td4028461.htmlから、JDKのバージョンを上げたところ、うまく1ピクセルの横棒が表示されるようになってアセンブリをかけるようになった。

Fill.asmのアセンブリ

一応乗っけとこう。とはいえ、無駄な部分があるんだよなぁ。ごめんなぁ。

// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/04/Fill.asm

// Runs an infinite loop that listens to the keyboard input. 
// When a key is pressed (any key), the program blackens the screen,
// i.e. writes "black" in every pixel. When no key is pressed, the
// program clears the screen, i.e. writes "white" in every pixel.

// Put your code here.
(LOOP)

    @i
    M=0

    @KBD
    D=M

    @BLACK
    D;JGT

    (WHITE)
        @SCREEN
        M=0

        @i
        D=M

        @8190
        D=D-A

        @LOOP
        D;JGT

        @i
        D=M+1

        @SCREEN
        A=A+D
        M=0

        @i
        M=M+1
    @WHITE
    0;JMP


    (BLACK)
        @SCREEN
        M=-1

        @i
        D=M

        @8190
        D=D-A

        @LOOP
        D;JGT

        @i
        D=M+1

        @SCREEN
        A=A+D
        M=-1

        @i
        M=M+1
    @BLACK
    0;JMP

@LOOP
0;JMP

(END)
@END
0;JMP