Chapter 4マシン-[最下位から作成されたコンピューティングシステム]

7038 ワード


マシン言語の目的は、ターゲットハードウェアプラットフォーム上でコマンドを直接実行し、ハードウェアを完全に制御することです.新しいコンピュータシステムを理解するには、まずシステムのマシン言語プログラムを表示すると役立ちます.

4.1背景


4.1.1機械


マシン言語は、プロセッサとレジスタを使用してメモリを操作できる予め定義されたルールです.
  • メモリ
    メモリは、コンピュータにデータと命令を格納するハードウェアデバイスです.
  • プロセッサ
    一般に中央プロセッサ(CPU)と呼ばれるプロセッサは、予め定められた基礎演算を実行する装置である.メモリとレジスタのバイナリ値を被演算子とし、演算出力値を選択したメモリアドレスまたはレジスタに格納します.
  • レジスタ
    CPUが常に距離を保つメモリやデータの交換には比較的時間がかかるため、多くのプロセッサには複数のレジスタがあり、1つの値を格納することができます.
  • 4.1.2言語


    マシン言語プログラムは命令をバイナリ符号化する.例えば、16ビットコンピュータでは、コマンドは通常101000110001001001として表される.このマシンは4つのフィールドで構成され、4つの4ビットごとに、最も左側のフィールドはCPU演算タイプを表し、残りのフィールドは被演算子を表す.
    バイナリコードだけを見て説明するのは難しいので、機械言語ではバイナリコードと演算記号が一般的に使われています.例えば、1010はADDであり、残りのフィールドはR 3、R 1、R 9である.
    これらの連想記号を用いた記号法を「アセンブリ言語」または単純な「アセンブリ」と呼び,アセンブリをバイナリマシン語コードに翻訳するプログラムを「アセンブリプログラム」と呼ぶ.

    4.1.3命令


  • 算術と論理演算
    すべてのコンピュータは、加算や減算などの基礎演算に加えて、ビット反転、ビット移動などの非演算、論理演算を行うことができる必要がある.
    	ADD R2,R1,R3 // R2<-R1+R3 R1, R2, R3는 레지스터다. 
    	ADD R2,R1,foo // R2<-R1+foo, foo는 사용자가 정의한 이름으로, foo가 가리키는 메모리 주소의 값을 뜻한다. 
    	AND R1,R1,R2 // R1<-R1과 R2을 비트 단위로 And 연산한 결과

  • メモリアクセス
    メモリアクセスは、算術および論理コマンドに自然に含まれ、レジスタとメモリの間でデータを移動するロード、ストレージコマンドがあります.
    メモリアクセス命令にはいくつかのアドレスモードがあります.
    	// 직접 주소 지정 방식
        LOAD R1, 67		// R1<-Memory[67]
        // 또는 bar가 메모리 주소 67을 나타낸다고 가정하면
        LOAD R1, bar	// R1<-Memory[67]
    
    	// 즉시 주소 지정 방식
        LOAD R1, 67		// R1<-67
        
        // 간접 주소 지정 방식
        // x=foo[j] 또는 x=*(foo+j)의 번역
        ADD R1, foo, j	// R1<-foo+j
        LOAD* R2, R1	// R2<-Memory[R1]
        STR R2, x		// x<-R2

  • せいぎょりゅう
    プログラム内のコマンドは通常順番に実行されますが、突然他の場所に分岐して実行されることがあります.ブランチには、重複、条件実行、サブルーチン呼び出しなど、いくつかのタイプがあります.
    //고수준
    // while 루프
    while (R1>=0) {
    	code segmnet 1
    }
    code segumnet 2
    // ---------------------------------------------
    
    // 저수준
    beginWhile:
    	JNG R1, endWhile	// If R1<0 goto endWhile
        // 세그먼트 1의 번역은 여기에 위치한다. 
        JMP beginWhile		// goto beginWhile
    endWhile:
    	// 세그먼트 2의 번역은 여기에 위치한다. 
  • 4.2核機械リスト


    基本的に、コアコンピュータは携帯電話のノーマンプラットフォームであり、CPU、命令メモリ、データメモリ、スクリーン、キーボードに対応するメモリマッピングI/Oデバイスからなる16ビットデバイスである.

    4.2.1概要


  • メモリアドレス空間
    カーネルでは,アドレス空間は命令を格納するメモリとデータを格納するメモリに分けられる.2つの幅16ビットのメモリのアドレス空間は15ビットであり、最大32 Kの16ビットの単語にアドレスを割り当てることができる.また,コア上のCPUは,命令メモリ(ROM)に存在するプログラムしか実行できない.

  • n.レジスタ
    コアシステムには、データ値のみを格納するDレジスタと、データ値とアドレス値のみを格納できるA 16ビットレジスタがある.例えば、D=M+1では、Mは常にAに格納された値をアドレスとするメモリデータを表す.また、分岐指令の到達位置は、常にAに記憶された値を宛先とする.
  • 4.2.2 A-コマンド


    A-命令Aレジスタに15ビット値を設定する.
  • 定数
  • データアドレス
  • ジャンプするコマンドアドレス
  • 使用法:@value
    valueは、10進数(負以外の値)またはその数字を参照する記号です.

    4.2.3 C-命令


    Cコマンドは、核プラットフォーム上でほとんどの作業を実行します.この命令は次の質問に対する答えです.
  • は何を計算しますか?
  • で計算された値はどこに格納されますか?
  • これから何をしますか?
    C-명령어 : dest = comp;jump	// dest나 jump 필드는 공란일 수 있다. 
    							// dest가 공란이면 '='가 생략된다. 
                                // jump가 공란이면 ';'가 생략된다. 

    一番上のビット値1は、そのコマンドがCコマンドであることを示すコードです.そして2ビットは使いません.compフィールドはALUが実行する演算が何であるかを示し、destフィールドは計算した値をどこに格納するかを示す.ジャンプフィールドはジャンプ条件を表します.

  • 計算フィールド(計算フィールド)

    計算フィールドのaビットは、Aレジスタとメモリのどちらの値を計算するかを決定します.そして残りのc 1~6はどのような計算をするかを決める.これはChap 2に現れるALUに似ている.その原因は次章で説明する.

  • 宛先フィールド(宛先フィールド)

    「宛先」フィールドは、compセクションで計算した値をどこに保存するかを示します.ここで、d 1はAレジスタ、d 2はDレジスタ、d 3は記憶[A]を担当し、値をアクティブビットが担当する位置に記憶する.

  • ジャンプフィールド(ジャンプフィールド)

    ジャンプフィールドは、コマンドを実行するコンピュータが現在どの位置のコマンドを実行するかを決定します.
    しかし、実際にジャンプするかどうかはALUの出力値に依存し、出力値が負の場合、j 1、0、j 2、正の場合、j 3ビットが表示され、ジャンプするかどうかが決定されます.
  • 4.2.4符号


    コンポーネントコマンドは、定数またはシンボルを使用してメモリアドレスを参照できます.

  • 定義済みシンボル
    -仮想レジスタ:R 0~R 15は、RAMアドレス0~15を指すように定義される.
    -事前定義ポインタ:SP、LCL、ARG、THIS、およびTHATシンボルは、それぞれRAMアドレス0〜4を参照するように定義される.このルールは、仮想マシンの実装に役立ちます.
    -I/Oポインタ:SCREENおよびKBDシンボルは、RAMアドレス16384(0 x 4000)および24576(0 x 6000)をそれぞれ参照する.これらのアドレスは、スクリーンとキーボードのメモリマッピングの開始アドレスとなります.

  • ラベル記号
    ブランチコマンドの宛先を示すラベル記号は、ユーザが直接「(XXX)」と宣言する.

  • 変数記号
    前の2つの記号がそうでない場合.構成要素は、RAMアドレス16から順に、変数毎に一意のメモリアドレスを割り当てる.
  • 4.2.5入出力操作


    コアプラットフォームはキーボードとスクリーンデバイスに接続できます.2つのデバイスは、メモリマッピングによってコンピュータと通信します.キーボード入力は対応するメモリマッピングに格納され、画面に対応するメモリ位置に値を書き込むと、対応する画面にピクセルが書き込まれます.

  • スクリーン
    コアコンピュータの画面は512列X 256行の白黒画素からなる.また、画面上の画素は、RAM[16384]からの8 Kメモリマッピングに対応する.各列は32個の16ビットの単語で表される.

  • キーボード
    コアコンピュータは、RAM[24576]にある単語メモリマッピングを介してキーボードと通信する.実際,キーボードを押すたびに,キーの16ビットのASCIIコードが記録される.キーが押されていない場合は0を記録します.
  • 4.2.6命令例


    C言語
      // 1+..+100 덧셈
          int i = 1;
          int sum = 0;
          While (i <= 100) {
              sum += i;
              i++;
          }
          
    かくマシンご
      // Adds 1+...+100.
        	@i		// i는 어떤 메모리 위치를 참조함
        	M=1		// i=1
        	@sum	// sum은 어떤 메모리 위치를 참조함
        	M=0		// sum=0
      (LOOP)
      		@i
        	D=M		// D=i
      	    @100
      	    D=D-A		// D=i-100
     	    @END
     	    D;JGT		// if (i-100)>0 goto END
    	    @i
            D=M		// D=i
            @sum
            M=D+M		// sum=sum+i
            @i
            M=M+1		// i=i+1
            @LOOP
            0;JMP		// Goto LOOP
      (END)
      		@END
        	0;JMP	// 무한루프(남은 실행횟수 소모)
        

    4.4実施


    4.4.1乗算プログラム(Multi.asm)

        @2
        M=0     // R2를 0으로 초기화한다. R2에는 결과값이 저장된다. 
    (LOOP)
        @0      
        D=M     // R0의 값을 D에 저장한다. R0은 몇번 곱할지 남은 횟수를 나타낸다. 
        @END
        D;JEQ   // D의 값이 0이 되었다면 계산을 종료한다. 
        @1
        D=M     // R1의 값을 D에 저장한다. 
        @2      
        M=M+D   // R2 += D
        @0
        M=M-1   // 남은 곱셈 횟수를 1감소시킨다. 
        @LOOP
        0;JMP   // 무조건 LOOP으로 점프한다. 
    (END)
        @END
        0;JMP

    4.4.2 I/O操作プログラム(Fill.asm)

    @i
    M=0     // i = 0 초기화
    
    (LOOP)
    
        @KBD
        D=M     // 현재 키보드에 입력된 값을 D에 대입
    
        @NOINPUT
        D;JEQ   // D == 0 jump
        @INPUT
        D;JGT   // D > 0 jump
    
    (NOINPUT)
        @16384      // 
        D=A         //
        @i          // 현재 스크린 위치 -> A
        D=D+M       // 16384+i(1)
        A=D         //
    
        M=0         // 현재 스크린위치에 0000 0000 0000 0000 대입
    
        @END
        0;JMP
    (INPUT)
        @16384      // 
        D=A         //
        @i          // 현재 스크린 위치 -> A
        D=D+M       //
        A=D         //
    
        M=-1        // 현재 스크린 위치에 1111 1111 1111 1111 대입
    
        @END
        0;JMP
    (END)
        @i
        M=M+1       // i = i + 1
    
        @LOOP
        0;JMP       // LOOP로 jump