Y86程序中的每条指令都会读取或修改处理器状态的某些部分。
既可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。
(1)8个,%eax、%edx、%ebx、%esi、%edi、%esp和%ebp。
(2)处理器的每个程序寄存器存储一个字。
(3)寄存器%esp被入栈,出栈,调用和返回指令作为栈指针。
(4)其他情况,有三个一位的条件码:ZF,SF和OF。
(5)程序计数器(PC)存放当前正在执行指令的地址。
(1)一个很大的字节数组,保存着程序和数据。
(2)Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。
5.状态码Stat:它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。
(1)分成了四个不同的指令:irmovl,rrmovl,mrmovl和rmmovl.
(2)源可以是立即数(i),寄存器(r)或存储器(m)。
目的可以是寄存器(i)或存储器(m)。
指令名字的第一个字母就表明了源的类型,指令名字的第二个字母就指明了目的类型。
注意:(1)这里的存储器引用方式是简单的基址和偏移量形式,寻址方式不支持第二变址寄存器和任何寄存器值的伸缩。
(2)两个操作数不能都是来自存储器,也不允许将立即数传送到存储器。
addl 加
subl 减
andl 乘
xorl 除
(1)它们只对寄存器数据进行操作(I32还允许对存储器数据进行操作)。
(2)这些指令会设置三个条件码:ZF,SF和OF(零,符号和溢出)。
jmp,jle,jl,je,jne,jge和jg。
cmovle,cmovl,cmove,cmovne,cmovge和cmovg.
只有当条件码妈祖所需要的约束时,才会更新目的寄存器的值。
call指令将返回地址入栈,然后跳到目的地址。ret从这样的过程调用中返回。
实现了入栈和出栈。
(1)停止指令的执行。
(2)执行halt指令会导致处理器停止,并将状态码设置为HLT。
(1)每条指令需要1-6个字节不等,每条指令的第一个字节表明指令的类型。
(2)第一字节分为两部分:
高四位:代码部分,值域为0~0xB。
低四位:功能部分,功能值只有在一组相关指令共用一个代码时才有用。
(3)8个程序寄存器中每个都有相应的0~7的寄存器标识符。当需要指明不应访问任何寄存器时,用ID值0xF表示。
(1)描述程序执行的总体状态。
(2)AOK 正常操作
HLT 处理器执行halt指令
ADR 遇到非法地址
INS 遇到非法指令
(1)Y86有时需要两条指令来完成IA32一条指令就能完成。
(2)Y86没有伸缩寻址模式。
两个特别的指令:pushl和popl 通常有两种约定
(1)压入%esp的原始值。
(2)压入减去4的%esp得出值。
电子电路中,逻辑1是用1.0V左右的高电压表示,逻辑0用0.0V左右的低电压表示。
1.逻辑门产生的输出,等于它们输入位值的某个布尔函数。
AND &&
OR ||
NOT !
3.逻辑门只对单个位的数进行操作,而不是整个字。
4.逻辑门总是活动的,输入变化输出很快就跟着变化。
(1)两个或多个逻辑门的输出不能连接在一起。
(2)必须无环。
(1)组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值。
(2)逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE。
(3)c的逻辑表达式可能被部分求值。
1.所有字级的信号都声明为int,不指定字的大小。
2.多路复用函数用情况表达式来描述。
3.选择表达式为1时,表示如果前面没有情况被选中,就选择这种情况。
4.不同选择表达式之间允许不互斥。
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,...,iexprk}
iexpr等都是整数表达式。
(1)时钟寄存器:存储单个位或字。时钟信号控制寄存器加载输入值。
(2)随机访问储存器:储存多个字,用地址选择该读/写哪个字。
SEQ处理器
(1)取指:
(2)译码:
(3)执行:
(4)访问;
(5)写回:
(6)更新PC:
详细内容见书P251。
2.OPl(整数和逻辑运算),rrmovl(寄存器-寄存器传送)和irmovl(立即数-寄存器传送)类型的指令所需的处理。见书P252 图4-18
3.rmmovl和mrmovl所需要的处理。见书 P253 图4-19
4.处理pushl和popl指令所需的步骤。见书 P254 图4-20
5.跳转,call和ret三类控制转移指令的处理。 见书P256 图4-21
(1)浅灰色方框表示硬件单元。
(2)控制逻辑快是用灰色圆角矩形表示的。
(3)线路的名字在百色椭圆中说明。
(4)宽度为字长的数据连接用中等粗度的线表示。
(5)宽度为字节或更窄的数据连接用细线表示。
(6)单个位的连接用虚线来表示。
1.SEQ的实现包括组合逻辑和两种存储器设备:
(1)时钟寄存器-程序计数器和条件码寄存器。
(2)随机访问存储器-寄存器文件,指令存储器和数据存储器。
(3)剩下四个:
①条件码寄存器:只在执行整数运算指令时装载
②数据存储器:只在执行rmmovl、pushl或call时写入
③寄存器文件:两个写端口允许每个时钟周期更新两个程序寄存器。特殊寄存器?0xF表示此端口不应执行写操作。
在控制逻辑中必须被显式引用的常数:
(1)nop指令:PC+1,别的只经过不改变。
(2)halt指令:使处理器状态变为HLT,导致停止运行。
以PC为第一个字节,读6个字节。
(1)两个逻辑块:
指令代码:icode
指令功能:ifun
(2)三个一位的信号
instr_valid:发现不合法的指令.
need_regids:包含寄存器指示符字节吗
need_valC:包括常数字吗
都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB
(1)包括算术/逻辑单元ALU,输出的是valE。
(2)包括条件码寄存器。
(1)读或者写程序数据。
(2)根据icode,imem_error,instr_valid,dmem_error,从指令执行的结果计算状态码Stat。
会产生程序计数器的新值。
cd ~/Code/shiyanlou_cs413
wget http://labfile.oss.aliyunce.com/courses/413/sim.tar
tar -xvf sim.tar
cd sim
sudo apt-get install tk
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
cd y86-code
进入测试代码,教材p239页代码为asuml.ys,可以通过
make asuml.yo
进行汇编,asuml.yo就是汇编后的结果,见教材p238。
make all
可以汇编运行所有代码结果。
1.《深入理解计算机系统》教材第四章《处理器体系结构》
2.https://www.shiyanlou.com/courses/413 实验楼《深入理解计算机系统》实验五——处理器体系结构
3.https://www.shiyanlou.com/courses/413 实验楼《深入理解计算机系统》实验四——程序的机器级表示
4. IA32 and x86-64 Documentation和Y86 Tools