最近在读《计算机系统要素》,看一些基础的东西。发现这本书如果大学学汇编前读那该多好,虽然有些部分难,但是浏览个大概还是可以的。读完就知道汇编这东西有什么用了。还有学模电也是如此,刚开始不知道那些与或门是哪里来的,也不知道有何用。
这本书前五章都在讲硬件平台的东西,从最基本的NAND门开始给你去构造其他的门。到布尔逻辑,自己构建加法器,输入选择器还有多位的选择器。接下来是时序逻辑的东西,关于时钟周期的。接下来是汇编语言,和8086的那个汇编有区别,但是很相似。基本就是把我大二大一学的东西连了一次。看到这本书的时候已经在毕业后了,所以,还没毕业的,如果你刚好看到我这篇东西,建议去读一下,即使不做每章的习题。我觉得过了一次之后还是大有益处。
书有个不好的地方在于一些习题的答案你虽然知道思路,却不知道表示方法。像数组那些。
这位同学写得很好,http://book.douban.com/review/7115224/
书的习题部分有一部分是一位芝加哥的比较年轻的老外写的,还有一些是这位网友写的。
而在第六章要自己写个汇编的编译器的时候,我就非常感兴趣了。毕竟编译原理没学过。而网友的Github代码是用Python实现。
然后我自己想了想,自己用Java实现一次吧。首先根据习题提供的加法的汇编文件,Add.asm进行基础的编译。
Hack是基于冯诺依曼架构的16位计算机。Hack语言包括两种指令:A-指令和C-指令。
具体表示什么就看书上的第四章吧。
基本的思路是。过滤掉//注释的代码。根据是A指令的标识@进行二进制转换。
根据C指令的形式也进行转换。
指令与二进制数有着特殊的额对应关系。
所以将其写进properties文件中。
Java部分代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
/**
* @author Caikc
* @description
* @date 2016-1-7 下午3:52:32
* @company www.ewan.cn
*/
public class Assembly {
/**
* get keyvalue from compile file
* @param key
* @return
* @throws IOException
*/
public static String getcompile(String key) throws IOException {
InputStream ips = Assembly.class
.getResourceAsStream("compile.properties");
Properties p = new Properties();
p.load(ips);
/*
* Enumeration e = p.propertyNames(); while(e.hasMoreElements()){
* if(key.equals((String)e.nextElement())){
* System.out.println(p.get(key)); } }
*/
return (String) p.get(key);
}
-
关键字: