《计算机系统要素》章节试读

当前位置:首页 > 网络编程 > 计算机理论基础知识 > 计算机系统要素章节试读

出版社:电子工业
出版日期:2007-01-01
ISBN:9787121033360
作者:Noam Nisan,Shimon Schocken
页数:325页

《计算机系统要素》的笔记-第59页 - 布尔运算

按照“穿越计算机的迷雾”一书提供的简单的公式 弄出了ALU的no标志位的处理
忽然发现个化简原则,就是 not(x)*y + x*not(y) 这种形式可以化简成 Xor(x,y)
特此记录下

《计算机系统要素》的笔记-第96页 - 机器语言

机器语言设计得有点问题 dest 寄存器有 ADM 刚好对应三个比特位
为了简化实现 作者把 D+M 这样的功能直接看成一个符号 这个无可厚非
但是在dest的表示上 却非要写成MD=D+M 我觉得 应该统一下 符号组合顺序也应该按照ADM这样的顺序来 避免折腾读者 毕竟 本书的阅读要求是会一门编程语言
本章节的那两个项目 一个乘法器实现 这个由于之前我看CSAPP想过 所以思路上并不难 但是实现上却花了我整一天 昨天一下午 加上今天一下午
一开始 我是按照高阶语言的想法 先做个LSHIFT实现 各种错误 还得自己实现 call ret机制 总有这样那样的问题 可能是代码长了的原因 难以兼顾到
今天起床以后(12点)痛定思痛 想了个办法 先写出伪代码 再来一行一行翻译 而不是直接写他的那个汇编码 然后写伪代码的过程中想到了 其实不必实现完整的LSHIFT 只要有个mask 每次循环都左移一次就够了 而左移一次 无非是x2 也就是自己加上自己而已 这样下来 代码大大简化 最后终于实现了乘法器
说起来 昨晚一开始想实现左移的时候 也是头疼 大多数机器位移总是有的 但是本书的奇葩机器太精简了 所以这个也没有 想了半天没想明白 后来一拍脑袋才想起左移一位只不过等于自己加自己一次 也就通了
这里把乘法器的实现贴一下
// 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/Mult.asm
// Multiplies R0 and R1 and stores the result in R2.
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)
// Put your code here.
// pseudo code
// r2=0
// mask=1
// tmp=r0
// ct=16
// do:
// x = r1 & mask
// if x>0 then r2+=tmp
// ct -= 1
// mask <<= 1
// tmp <<= 1
// while( ct > 0 )

(MAIN)
@R2
M=0 // r2=0
@mask
M=1 // mask=1
@R0
D=M
@tmp
M=D // tmp=r0
@16
D=A
@ct
M=D // ct=16
(DO)
@R1
D=M
@mask
D=D&M // x = r1 & mask
@AFTER
D;JLE // if x<=0 then goto after else r2 += tmp
@tmp
D=M
@R2
M=D+M
(AFTER)
@ct
M=M-1 // ct -= 1
@mask
D=M
M=D+M // mask <<= 1
@tmp
D=M
M=D+M // tmp <<= 1
@ct
D=M
@DO
D;JGT // while ( ct > 0 )
(DOEND)
(END)
@END
0;JMP
关于按键监测那个 有几个需要注意的
首先因为要执行的时钟有点长 写一次屏幕 至少24k时钟 所以应该把cpu模拟器那个动画效果关闭掉 这样才可以有个可接受的响应速度
其次是对于16个像素都写的情况 你需要的值是-1而不是65535
再次对于按键与不按键的后续处理 其实都是要写屏 只不过是值不一样 所以可以用个变量根据按键与否存储对应的值 (-1/0) 然后后面用这个值去写屏
最后为了简化代码 减少重复 你需要实现类似c语言的指针取值的概念 这里需要的是下面这种代码
@pointer
A=M
D=M
我把我的实现也贴下
// 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.
// pseudo code
// r0=24576 // Keyboard
// r1=16384 // Screen
// do
// x = *(r0)
// if ( x>0 ) then do write_screen(1) else write_screen(0) while (1)
@24576
D=A
@R0
M=D
@16384
D=A
@R1
M=D
(LOOP)
@R0
A=M
D=M
@CLEAR
D;JEQ
@pixel
M=-1
@ENDIF
0;JMP
(CLEAR)
@pixel
M=0
(ENDIF)
@8192
D=A
@ct
M=D
@R1
D=M
@pt
M=D
(WHILE0)
@pixel
D=M
@pt
A=M
M=D
@pt
M=M+1
@ct
MD=M-1
@WHILE0
D;JGT
@LOOP
0;JMP

《计算机系统要素》的笔记-第126页 - 第七章,堆栈运算

按照惯例,堆栈被描述为栈顶朝下,并向下增长得数据结构。

《计算机系统要素》的笔记-第167页 - 第八章 虚拟机2 程序控制

这里的一幅图片真的是经典 ARG LCL SP 是什么呢?

《计算机系统要素》的笔记-第74页 - 时序逻辑

经过了第1,2两章,这章相对容易点
感觉那个硬件语言设计得有点缺陷 可以在以下方面改进下:
1, 支持循环语句,当然是以宏的方式
2, 用别的方式表示bus, 那个[0]表示bus的方法很让人不爽

《计算机系统要素》的笔记-第27页

勘误
P27, 1.5项目,资源——
“另外,我们还提供了 .tst脚本文件,用来告诉硬件仿真器如何进行测试,同时脚本本件将会产生一个正确的 .cmp输出文件或称'
比较文件(compare file)'”
原文:
In addition, for each chip we provide a .tst script file that tells the hardware simulator how to test it, along
with the correct output file that this script should generate,called .cmp or “compare file.”
另外,对于每个芯片我们提供了.tst脚本文件,用来告诉硬件仿真器如何测试,还有.cmp文件或称“比较文件(compare file)”,一起帮助生成正确的输出文件(.out)。

《计算机系统要素》的笔记-第20页 - 第一章 布尔逻辑

试了下用Nand门来构建那三个基本逻辑门 Not And Or
很有意思 在C里 优先级是 Not And Or
在这里的硬件实现上 按消耗Nand门的数量倒叙也是这个顺序
这里列下他们的实现
CHIP Not {
IN a;
OUT out;
PARTS:
Nand(a=a,b=a,out=out);
}
CHIP And {
IN a,b;
OUT out;
PARTS:
Nand(a=a, b=b, out=w);
Nand(a=w,b=w,out=out);
}
CHIP Or {
IN a,b;
OUT out;
PARTS:
Nand(a=a, b=a, out=na);
Nand(a=b, b=b, out=nb);
Nand(a=na, b=nb, out=out);
}
CHIP Xor {
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=b, out=nandw);
Or(a=a, b=b, out=orw);
And(a=nandw, b=orw, out=out);
/** 这里被注释掉的是官方给的版本
Not (in=a, out=nota);
Not (in=b, out=notb);
And (a=a, b=notb, out=w1);
And (a=nota, b=b, out=w2);
Or (a=w1, b=w2, out=out);
**/
}
最后那个 Xor 我的版本比官方的少用3个Nand门 估计现实中也是这么设计的 官方那个只是从布尔代数逻辑映射出来的

《计算机系统要素》的笔记-第21页 - 1.2 规范详述

1.De Morgan Laws : NOT (x AND y) = NOT (x) OR NOT (y) ; NOT (x OR y) = NOT (x) AND NOT (y)
2.Multiplexor3.Demultiplexor

《计算机系统要素》的笔记-第10页 - 1.1 背景知识

1.每个布尔函数,不管多复杂,都可以只使用三个布尔算子And, Or, Not来完全表达。
2. 3.And/Or/Not 算子都可以只用Nand或Nor函数来建构x or y =(x Nand x) Nand (y Nand y)。
4.每个布尔函数也仅能使用Nand函数来构成。

《计算机系统要素》的笔记-第67页 - Hack机器语言规范详述

图4.3 右上角(当 a = 0)修改为(当 a = 1)


 计算机系统要素下载 更多精彩书评


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024