Java语言实现的Hack语言汇编编译器——加法器部分

 

最近在读《计算机系统要素》,看一些基础的东西。发现这本书如果大学学汇编前读那该多好,虽然有些部分难,但是浏览个大概还是可以的。读完就知道汇编这东西有什么用了。还有学模电也是如此,刚开始不知道那些与或门是哪里来的,也不知道有何用。


这本书前五章都在讲硬件平台的东西,从最基本的NAND门开始给你去构造其他的门。到布尔逻辑,自己构建加法器,输入选择器还有多位的选择器。接下来是时序逻辑的东西,关于时钟周期的。接下来是汇编语言,和8086的那个汇编有区别,但是很相似。基本就是把我大二大一学的东西连了一次。看到这本书的时候已经在毕业后了,所以,还没毕业的,如果你刚好看到我这篇东西,建议去读一下,即使不做每章的习题。我觉得过了一次之后还是大有益处。


书有个不好的地方在于一些习题的答案你虽然知道思路,却不知道表示方法。像数组那些。


这位同学写得很好,http://book.douban.com/review/7115224/


书的习题部分有一部分是一位芝加哥的比较年轻的老外写的,还有一些是这位网友写的。


而在第六章要自己写个汇编的编译器的时候,我就非常感兴趣了。毕竟编译原理没学过。而网友的Github代码是用Python实现。
然后我自己想了想,自己用Java实现一次吧。首先根据习题提供的加法的汇编文件,Add.asm进行基础的编译。


Hack是基于冯诺依曼架构的16位计算机。Hack语言包括两种指令:A-指令和C-指令。


具体表示什么就看书上的第四章吧。


基本的思路是。过滤掉//注释的代码。根据是A指令的标识@进行二进制转换。
根据C指令的形式也进行转换。
指令与二进制数有着特殊的额对应关系。


所以将其写进properties文件中。


Java部分代码:

 

  1. import java.io.BufferedReader;

  2. import java.io.File;

  3. import java.io.FileInputStream;

  4. import java.io.FileNotFoundException;

  5. import java.io.IOException;

  6. import java.io.InputStream;

  7. import java.io.InputStreamReader;

  8. import java.util.ArrayList;

  9. import java.util.Enumeration;

  10. import java.util.List;

  11. import java.util.Properties;

  12. /**

  13. * @author Caikc

  14. * @description

  15. * @date 2016-1-7 下午3:52:32

  16. * @company www.ewan.cn

  17. */

  18. public class Assembly {

  19. /**

  20. * get keyvalue from compile file

  21. * @param key

  22. * @return

  23. * @throws IOException

  24. */

  25. public static String getcompile(String key) throws IOException {

  26. InputStream ips = Assembly.class

  27. .getResourceAsStream("compile.properties");

  28. Properties p = new Properties();

  29. p.load(ips);

  30. /*

  31. * Enumeration e = p.propertyNames(); while(e.hasMoreElements()){

  32. * if(key.equals((String)e.nextElement())){

  33. * System.out.println(p.get(key)); } }

  34. */

  35. return (String) p.get(key);

  36. }

  37. 关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信