2.处理器为单周期设计。
GPR (通用寄存器组,也称为寄存器文件、寄存器堆)、ALU(算术逻辑单
元)、EXT(扩展单元)、IM(指令存储器)、DM(数据存储器)。
4.Figure1为供你参考的数据通路架构图。
a)我们不确保Figure1是完全正确的。
b)鼓励你从数据通路的功能合理划分的角度自行设计更好的数据通路架构。
c)如果你做了比较大的调整,请务必注意不要与要求5矛盾。
5.整个project必须采用模块化和层次化设计。
第1节 计算机中数值数据的表示随堂测验
第1章 计算机基础知识单元测验
2、将二进制数.01分别转换成八进制数和十六进制数。
6、两个十六进制补码数7825H和5A1FH相加运算后,其溢出标志OF值是 。
7、若寄存器CS的值为1200H,IP的值为2500H,则其对应的物理地址为 。
8、8086CPU中,在没有特别说明的情况下,若偏移地址来自SP寄存器,则在计算物理地址时段基址来自 寄存器。
9、1个基本总线周期包含 个时钟周期。
1、十六进制数8ACFH与十六进制数5115H相加,请写出运算后六个标志状态位的值。
2、请写出时钟周期、总线周期与指令周期的含义。
1、1.按照题目中提出的要求,写出能达到要求的一条(或几条)汇编形式的指令。 (1)将立即数1234H送入寄存器BX。 (2)将变址寄存器SI的内容送入数据段中2000H的存储单元。 (3)把BX与CX寄存器内容相加,结果送入BX。 (4)寄存器BX中的低4位内容保持不变,其他位按位取反,结果仍在BX中。 (5)实现AX除以2的运算,假设AX的内容为无符号数。
1、你认为微机原理教学效果如何?应该如何改进?
2、请写出完整的汇编程序框架结构
181112微机原理课程考试试运行
2、分析电路,说明138的工作情况,2764的片选信号、容量、地址范围
湖北文理学院物电学院下学期微机原理期末考试
22、堆栈是以先进后出方式工作的存储空间。
23、所有PC机具有相同的指令集。
24、立即数只能存放在代码段中。
25、NOT指令不使CPU执行任何操作。
1、三、简答题:1、的中断向量表在存储器的什么位置(写地址范围)?表中存储的什么内容?如何根据中断类型找到中断处理程序的入口地址?
2、三、简答题:2、8086标志寄存器有几个标志位,控制标志位是哪几个?简要叙述控制标志位的功能。
3、四、读图题:读图回答问题,假设某CPU地址总线为16位,下图中高位地址线连接采用哪种方式?是否存在内存重叠区?每片内存的容量为多少?请写出左起第二、第四片存储器芯片的地址范围,并附上必要的推算过程。
4、五、设计题:某设计人员打算实现如下功能:从8255A的端口A读取一个八位开关量,作为用户输入的被减数,将其和数据段中另一个数45H相减,然后将运算结果通过8255端口B输出至8个发光二极管以二进制方式显示给用户。已知8255端口地址为60H-63H。请写出8255A的初始化程序(端口C未用),并添加必要代码实现如上功能(提示:采用程序控制传送方式,不需要查询,假定数据均以二进制补码进行输入、存储和显示)。
1、你认为微机原理教学效果如何?应该如何改进?
2、请写出完整的汇编程序框架结构
181112微机原理课程考试试运行
2、分析电路,说明138的工作情况,2764的片选信号、容量、地址范围
湖北文理学院物电学院下学期微机原理期末考试
22、堆栈是以先进后出方式工作的存储空间。
23、所有PC机具有相同的指令集。
24、立即数只能存放在代码段中。
25、NOT指令不使CPU执行任何操作。
1、三、简答题:1、的中断向量表在存储器的什么位置(写地址范围)?表中存储的什么内容?如何根据中断类型找到中断处理程序的入口地址?
2、三、简答题:2、8086标志寄存器有几个标志位,控制标志位是哪几个?简要叙述控制标志位的功能。
3、四、读图题:读图回答问题,假设某CPU地址总线为16位,下图中高位地址线连接采用哪种方式?是否存在内存重叠区?每片内存的容量为多少?请写出左起第二、第四片存储器芯片的地址范围,并附上必要的推算过程。
4、五、设计题:某设计人员打算实现如下功能:从8255A的端口A读取一个八位开关量,作为用户输入的被减数,将其和数据段中另一个数45H相减,然后将运算结果通过8255端口B输出至8个发光二极管以二进制方式显示给用户。已知8255端口地址为60H-63H。请写出8255A的初始化程序(端口C未用),并添加必要代码实现如上功能(提示:采用程序控制传送方式,不需要查询,假定数据均以二进制补码进行输入、存储和显示)。
3.1 什么是机器语言
前面提到“最早的计算机采用机器语言,这种语言直接用二进制数表示,通过直接输入二进制数,插拔电路板等实现,这种“编程”很容易出错,每个命令都是通过查命令表实现”。
比如要执行21号中断,需要查表,得到21号中断的指令就是CD 21。这样不管你通过什么方式,在内存指令位置,写入两个字节,一个是CD(这可不是音乐光盘,而是二进制数,转成十进制就是205),另一个是21(同样是十六进制,十进制是33)。
3.2 什么是汇编语言
前面也提到“既然是通过“查表”实现的,那当然也可以让计算机来代替人查表实现了。于是就产生了汇编语言”,汇编语言产生的重要目的就是用容易记的符号来代替容易出错的二进制数(或十六进制数)。
比如前面的21号中断,机器语言是CD 21。而汇编语言就规定中断用int表示(interrupt的前三个字母),21号中断就成了int 21h。其中21后面的h表示是表示这个21是十六进制。由于大小写不敏感,所以int 21h写成下列方式都等价:
───────────────────────────────────────
DAA 加法的十进制调整.
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
DAS 减法的十进制调整.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
商回送AL,余数回送AH, (字节运算);
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
───────────────────────────────────────
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位>1次时, 则由寄存器CL给出移位次数.
───────────────────────────────────────
1>无条件转移指令 (长转移)
JMP 无条件转移指令
以上四条,测试无符号整数运算的结果(标志C和Z).
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JNC 无进位时转移.
JNO 不溢出时转移.
JP/JPE 奇偶性为偶数时转移.
3>循环控制指令(短转移)
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允许位.
CLI 清中断允许位.
───────────────────────────────────────
3.4 再谈寄存器和内存的区别
第零讲说到“寄存器在CPU中。内存在内存条中。前者的速度比后者快100倍左右。后面的程序要求每条指定要么没有内存数据,要么在有一个寄存器的参与下有一个内存数据。(也就是说,不存在只访问内存的指令)。”
寄存器是在CPU中的存储器,而内存是在内存条中的存储器。CPU访问寄存器,只需要通过微指令直接就可以访问,而访问内存则要先经过总线,再由总线到达内存控制器,读到某单元的内存数据后放上总线,再传到CPU中,CPU才能使用。
8086系列计算机的寄存器,共有14个,每个都是十六位的。
其中前四位,每个可以单位再分成两个,AX=AH+AL,BX=BH+BL,CX=CH+CL,DX=DH+DL。这些分开的每个都是8位的。
这个分开不要理解成平时语言中的分开,你可以理解为AX是由AH和AL组合成的,你给AL付值,就意味着同时给AX的低半部付值。你给AX付值,就意味着同时改变AH和AL。这样作的好处是你可以更灵活地控制这个寄存器。
看了3.3的指令集和3.4的寄存器,是不是已经晕了,或者了迷糊?不要急,上面的东西虽然多,我也没让你一下学会,(其实有些永远也不会似乎也不是什么大不了的事)。为了应付看的懂我后面所说的,我把其中的指令挑几个重点的,你必须要记住,其它的慢慢学吧。
注意不是move,这个指令是把B中的数据复制给A,(B中仍保存原状)。这里的A和B可以是寄存器,可以是内存。但可以同时是寄存器,不能同时是内存。比如
mov ax,100 ;这是对的,注意100在这里叫立即数,但这个数在编译系统编译成exe的时候保存在内存中。如果学过别的高级语言,你就可以理解为这就是赋值语句 Let ax=100/ax:=100;/ax=100。
伪指令就是不是真的指令,但他同时又是指令。之所以说这样矛盾的话,是因为伪指令不是机器语言的一部分,而是汇编语言的一部分,是你告诉汇编的编译系统如何去作。
上面一行指令中,DB就是伪指令,他的作用就是告诉编译程序,把后面一些数据或字符串放到内存中。当然对于exe来说,已在内存中了,就不用“告诉”了。(这就是为什么叫伪指令)。string是你给这段内存起的名字,如果你不需要这段内存,不起名字也可以,但如果后面要用,当然要加上这个名字。'这是我的第一个汇编语言程序$'这个就是要处理的数据,当然你也可以换成别的内容,但需要注意的是,要以'$'结尾,这是汇编的约写,即:只是到了$,就认为字符串结束,否则就一直向下找,直到找到一个$为止。所以这就要求你的字符串中不能有'$',如果必须有,再换别的处理方式,后面再说。
前面已经定义了string,后面要把地址找到,就要用到lea指令。lea是把字符串的地址给A这个寄存器中,A当然可以上前面提到的任意寄存器。注意地址和内容的区别。如果是内容就是把string的字符串给A了。(当然这也不成立,一个字符串有很多字节,而一个寄存器只有两个字节)。
那么从上面也看到了,string代表一个地址,lea把这个地址给了A,那这个地址到底在哪里呢?事实上这不重要,就象你要把某书店买书,这个书店在哪并不是最重要的,有没有你要的书才是最重要的。所以你前面标出string,后面引用就行了,至于这个地址到底在哪是编译程序的事,不是你的事。
这个很容易理解吧,寄存器A加上N,把和仍存在A中。类似于高级语言中的let a=a+n/a:=a+n/a+=n。
记住串操作指令表面很复杂,其实很简单。
因为他就象一个复杂的数学公式一样简单,你所要记住的就是公式的格式,使用时具体套用即可。
从一个地址到另一个地址的复制需要注意的是:
*把源串段地址给DS。
*把目的串段址给ES。
*把目的串偏址给DI。
*把要复制的个数给CX,这里可不考虑$了。
*把FLAG中的方向标志标志你要的方向,一个是顺向,另一个是逆向。
int 中断号,注意进制,默认是十进制,所以十六进制就加h。
好了,上面的指令变成七八个了,这你不能嫌多了吧,如果再嫌多就不要继续向下看了。
data SEGMENT '数据段,编程者可以把数据都放到这个段里
'数据格式是: 标识符 db/dw 数据。
edata SEGMENT '附加数据段,编程者可以把数据都放到这个段里
上面就是一个程序的框架结构。在这个结构中,有三个段,DS,ES,CS。这三个段分别存数据,附加数据,代码段。
开始编写我们的第一个程序。
程序要求:显示一个“Hello,Mr.286.”怎么样?
1 要显示一个字符串,根据前面我让你们记的七八个指令够吗?答案是:不仅够,而且还用不完。
首先定义一下总可以吧。
2 首先要考虑的问题就是找中断,找到合适的中断,该中断就能帮我们完成这个显示任务。我找到(在哪找到的,怎么找到的,别问我,到网上或书上都能找到):
功能描述: 输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满
DS:DX=待输出字符的地址
说明:待显示的字符串以’$’作为其结束标志
由上面看到,我们所需要作的就是把DS指向数据段,DX指向字符串的地址,AH等于9H,调用21h中断。
由于只要在调用int 21h之前把准备的东西准备齐就行了,所以int 21h前面三行的顺序并不重要。
功能描述: 终止程序的执行,并可返回一个代码
把上面程序保存成hello286.asm后,就可以编译运行了。进入DOS,进入汇编目录,如果还没下载,到前面找下载地址。
说明:三个回车仍要默认,后面有个警告,没有栈段,这个没关系,没有的话系统会自动给一个。
本文通过例子介绍汇编程序的编写
刚刚学习了汇编语言,发现寻址方式非常重要,于是做了一个小总结,请各位笑纳。
现在就重点讨论寻址方式,说白了也就是cpu怎么样从指令中得到操作数的问题。另外再强调一点操作数还分种类:
1)数据操作数:全都是在指令当中参加操作的数据。
2)转移地址操作数:在指令当中不是参加运算或被处理的数据了,而是转移地址。
还可以按照下面分类方式:
源操作数都是指令当中的第2个操作数,在执行完指令后操作数不变。而目的操作数是指令当中的第1个操作数,在执行完操作指令后被新的数据替代。
我们就围绕这几种操作数,也就是操作数所在的位置展开讨论。
先说数据操作数,它分3大类共7种。
1)立即数寻址方式:是针对立即操作数的寻址方式。在指令当中直接给出,它根本就不用寻址。
在这里1234h和5678h都是立即操作数,在指令当中直接给出。
2)寄存器寻址方式:是针对寄存器操作数的寻址方式,它在寄存器中我们就用这中方式来找到它。
在这里ax,bx,ds都算是寄存器寻址,例1中的ax也是寄存器寻址方式。
3)存储器寻址方式:针对在内存中的数据(存储器操作数)都用这种方式来寻找,一共有5种(这是我自己的说法,便于记忆)。
不得不提及以下的概念:由于的字长是16bit,能够直接寻址2的16次方也就是64kb,而地址总线是20bit,能够直接寻址2的20次方也就是1M空间,所以把内存分为若干个段,每个段最小16byte(被称为小节),最大64kb,它们之间可以相互重叠,这样一来内存就被分成以16byte为单元的64k小节,cpu就以1小节为单位寻址:在段寄存器中给出段地址(16bit),在指令当中给出段内偏移地址(16bit),然后把段地址左移4bit再与偏移地址求和就得到数据在内存当中的实际物理地址了,因而可以找到数据。
1.存储器直接寻址方式:在指令当中以 [地址] 的方式直接给出数据所在内存段的偏移地址。
在这里[1234h]和VALUE就是在指令中直接给出的数据所在内存段的偏移地址(16bit)。
VALUE是符号地址,是用伪指令来定义的,它代表一个在内存中的数据(也就是它的名字)。es:是段前缀符,用来指出段地址,在这之前应该将段地址添入段中,本例中是es,默认是ds,也就是不需给出。应该注意 [地址] 与立即寻址的区别,在直接给出的数据两边加 []
另外作为特殊的寻址方式还有三种:I/O寻址,串寻址,隐含寻址。它们都分别针对I/O指令,串操作指令以及无操作数的指令,而且都比较简单,读者自行总结。
一定要记住寻址方式特别重要,这是我“毕生” 的总结,请笑纳,笑纳。