原创 Tiny語言編譯器開發之語法分析

  採用自頂向下的分析方法中的遞歸下降分析法,手工編寫語法分析器,源代碼如下: #include "globals.h" #include "util.h" #include "scan.h" #include "parse.h" s

原创 操作系統實踐之加載程序

  Loader程序主要作用是加載Kernel.bin到內存中,這一步與引導程序加載Loader.bin進入內存是類似的,Kernel.bin是在Linux下編譯的,是ELF格式的。因此,Kernel.bin加載內存後,需要將其中的代碼

原创 OpenGL與Memory DC

  //轉載自http://www.programfan.com/blog/article.asp?id=40490   用GDI繪圖時,雙緩衝是經常採用的技術。其中關鍵的一步,就是要先把圖形繪製到內存設備環境中,然後拷貝到屏幕上。 

原创 placement new體驗

#include <iostream> using namespace std; class A { public:  A();  A(const A&);  int i; }; A::A() {  i = 0;  cout << "d

原创 操作系統實踐之引導程序

  引導程序在引導扇區中,只有512字節的大小,引導程序難以完成許多工作,比如進入保護模式,加載內核,因此引導程序需要將這個工作交給一個擁有更大空間的程序,那就是Loader,引導程序只需將Loader加載入內存就好了,剩下的事情就由L

原创 操作系統實踐之使用Makefile

  通過命令行進行編譯是在太麻煩,使用Makefile就方便多了,下面這個MakeFile將編譯boot.bin(引導程序) loader.bin(加載程序)和Kernel.bin(操作系統內核),編寫過程比較簡單,需要主要的是編譯命

原创 Tiny語言編譯器之語義分析

Tiny語言的語義分析非常簡單,第一步先遍歷語法樹建立符號表,但是這個符號表本身並沒有太大的用處,只是爲變量分配了內存的地址,爲代碼生成做準備;第二步是類型檢查,主要對if語句、repeat語句的條件進行檢查,必須是Boolean類型

原创 操作系統實踐之開發環境

   操作系統的內核希望在Linux下通過nasm、gcc等編譯,但是又不想放棄Windows下的編輯環境,因此,比較理想的方式是在Windows下編輯,然後在Linux下編譯,因此需要在Windows和Linux(虛擬機)下共享文件。

原创 操作系統實踐之設置中斷

  在保護模式下設置中斷的步驟如下:   初始化8259A中斷控制器,設置IDT的內容 PUBLIC void init_8259A() {  out_byte(INT_M_CTL, 0x11);   // Master 8259, I

原创 Tiny語言編譯器之符號表

 Tiny語言編譯器的符號表還是很簡單的,主要的是寫了一個簡單的哈希表,共有211個桶,採用拉鍊法,用另外一個鏈表記錄了一個符號所出現的所有行號,源代碼如下: #include <stdio.h>#include <string.h>

原创 OpenGL三維混合

轉自:http://www.cnblogs.com/jacktu/archive/2010/06/04/1751170.html 也許你迫不及待的想要繪製一個三維的帶有半透明物體的場景了。但是現在恐怕還不行,還有一點是在進行三維場景

原创 Tiny語言編譯器之TM虛擬機接口

TM虛擬機接口用於生成TM指令,源代碼如下: //code.h //TM接口#ifndef _CODE_H_#define _CODE_H_#define pc 7 //程序寄存器#define mp 6 //指向數據區頂部#defin

原创 操作系統實踐之內存佈局

  本次操作系統實踐基本上是按照《自動動手寫操作系統》一書依葫蘆畫瓢,內存佈局如下:       ;              ┃                                    ┃     ;        

原创 Tiny語言編譯器開發之語法分析(利…

採用自底向上的LR分析方法,Yacc輸入文件yyparser.y如下: %{ #define YYPARSER #include "globals.h" #include "util.h" #include "scan.h" #incl

原创 操作系統實踐之中斷程序分析

%macro hwint_master 1         call save         in al, INT_M_CTLMASK         or al, (1 << %1)         out INT_M_CT