计算机系统要素:第四章 机器语言
来源:互联网 发布:眼镜清洗机牌子知乎 编辑:程序博客网 时间:2024/05/27 20:36
所谓机器语言,就是底层硬件能认同的语言,可以被看作是一种约定的形式,它利用处理器和寄存器来操控内存。
那么内存是什么?——用来储存数据和指令的硬件设备,可以通过提供它的地址来描述,比如几号存储柜。
谁来操控——处理器,通常称为中央处理器或者CPU,是执行一组固定基本操作的设备。这些操作通常包括算术操作和逻辑操作,内存读取操作和控制操作。当然内存操作的是二进制数值,它们来自寄存器或者指定的内存单元。
这里有个疑问,在第二章中构建的寄存器和内存单元是一样的组成单元,为何读取寄存器比内存快?
我个人理解:cpu中集成了寄存器,紧挨着处理器,相当于处理器的一个高速本地内存,使得处理起来能快速的操作数据和指令,而想要去得到内存的数据,先需要找到这个内存单元的地址,再对内存单元操作。
cpu要能一统所有硬件,需要所有硬件都能听懂,所以在之前我们要学会它们的语言(当然,也是我们人类发明的)。
计算机只能听懂0和1,所以与机器交流起来。。。。。。
算了,鉴于二进制相当晦涩,通常会在机器语言中同时使用二进制码和助记符,就是一种能人能看懂的符号,在经过编译器翻译成机器语言,比如add翻译过来就是1010这样的 。
在本章中要学的就是HACK语言,它包括了两种指令:一种是地址指令,也称为A—指令;另一种是计算指令,C-指令。
举个栗子:@i表示i这个变量的内存地址,M=1,表示把1赋给i.m总是代表一个内存单元中的数值。(要继续问为啥,我想没必要挖下去了,就相当于问你为啥叫张三一样)
@100
D=D-A;//D=i-100
指令代码的描述是对以下三种问题的回答:
(a)计算什么?
(b)将计算后的值存储到什么地方;
(c)下一步要干什么。
在书中,有个关于助记符表的地方,我认为有个小错,就是在对内存操作时a=1,不明白的可以看看书(p67中文版 计算机系统要素)
具体细节不做多解释,介绍项目:
编写并测试 乘法 和I/O处理程序
(1)乘法
通过加减法和移位来实现的;把除法转成乘法,乘法转成加法,减法也转成加法。
模拟CPU运算乘法的步骤:
假设计算3*3
原码是0011 * 0011(以4位存贮单元,因为是原码,最高位不代表符号位)
CPU中的乘法器过程如下:
3个寄存器分别存放乘数0011 被乘数 0011 一个部分积初始值为0
1、首先判断乘数寄存器(目前为0011)的最低位为1。如果为1则将部分积的值通过加法器加上被乘数0011。因此此步结束后部分积寄存器内容为0011
2、将乘数寄存器右移一位,同时将部分积寄存器也右移一位。同时乘积寄存器最低位溢出丢弃。部分积寄存器高位补0,低位溢出后填充到乘数寄存器。因此,部分积寄存其原来的值0011变成了0001。乘数寄存器0011变成了1001(这里低位的1溢出,最高位被部分积溢出的1填充)
3、判断乘数寄存器最低位(0001).为1。将部分积通过加法器加上被乘数0011。因此此不结束后部分积寄存器内容是(0001+0011=0100).
4、乘数寄存器右移一位,同时将部分积寄存器也有右移一位。同第2步。因此部分积寄存器原来的值0100变成了0010。乘数寄存器1001变成了0100,低位1溢出,最高位被部分积溢出的0填充。
5、判断乘数寄存器低位为0不做加法操作直接做第2步的移位操作。既有了部分积变成0001,乘数变成了0010。
6、判断乘数寄存器低位为0不做加法操作直接做第2步的移位操作。既有了部分积变成0000,乘数变成了1001;此时所有乘数全部处理完毕。
7、最终结果将部分积作为高位,乘数寄存器作为低位得到值为00001001 换算成10进制得到9
@ShiftM = 1@2M = 0@i //i = 0M = 0(FOR) //i < 16@iD = M @16D = D - A@ENDD;JGE@1 //R2 = R2 + {R0 & [0 - (R1 & Shift)]}D = M@ShiftD = D & MD = -D@0D = M & D@2M = M + D@0 //R0 << 1D = MM = M + D@Shift //Shift << 1D = MM = M + D@i //i++M = M + 1@FOR0;JMP(END)
(2)I/O处理程序 (长按下键时屏幕会3点变黑,无键按下时,清除)
首先来一段测试程序:(实现屏幕中的3点变黑)
(BEGIN)@SCREEN //屏幕的基地址 D=AM=1//1为黑 0为白@3D=D+AA=DM=1(END)@BEGIN0;JMP
(BEGIN)@KBD //键盘基地址是否有值,没有就跳转到清屏D = M@CLEAND;JEQ //有键按下@SCREEN //涂黑 D = AM = 1@1D=D+AA=DM=1@2D=D+AA=DM=1@END0;JMP(CLEAN) //无键盘按下 @SCREEN //涂白 D = AM = 0@1D=D+AA=DM=0@2D=D+AA=DM=0(END)@BEGIN0;JMP
- 计算机系统要素:第四章 机器语言
- 《计算机系统要素》学习笔记:第四章机器语言
- 计算机系统要素:第五章 计算机体系结构
- 计算机系统要素:第十二章 操作系统
- 计算机系统要素:第八章 虚拟机II 程序控制
- 计算机系统要素:第十章 编译器:语法分析
- 计算机系统要素:第十一章 编译器:代码生成
- 《计算机系统要素》学习笔记:第五章计算机体系结构
- 计算机系统要素:第二章 布尔运算
- 计算机系统要素:第三章 时序逻辑
- 《计算机系统要素》出版!!
- 计算机系统要素 project1
- 《计算机系统要素》概述
- 计算机系统要素:第六章 Part1 汇编编译器(nonsymbol)
- 计算机系统要素:第六章 Part2 汇编编译器(symbol)
- 计算机系统要素:第七章 虚拟机I:堆栈运算
- 《计算机系统要素》学习笔记:第二章布尔运算
- 《计算机系统要素》学习笔记:第三章时序逻辑
- struts2链接数据库的简单登陆验证
- input 框上传多个文件以及文件校验
- 基于MATLAB利用模拟退火算法解决费马点问题
- 数据结构之AOV网与拓扑排序
- 新手上路之oracle 增,删,改,查操作 笔记
- 计算机系统要素:第四章 机器语言
- CCF中学生计算机程序设计入门篇练习2.4.1(NOI1001 温度转换) pascal
- 学习笔记——自动登陆
- 贪心 openjudge特殊密码锁
- 区分js获取浏览器尺寸
- Linux下安装Python 3.6.1
- 计算机图形学笔记---shader language
- 洛谷 P2178 品酒大会(bzoj P4199 [Noi2015]品酒大会/uoj P131【NOI2015】品酒大会)
- 【POJ2976】Dropping tests 01分数规划