20144303 《信息安全系统设计基础》第六周学习总结(下)
第四章 处理器体系结构
Y86模拟器的安装:
4.3 Y86的顺序实现
1、将处理组织成阶段
取指:从存储器读取指令字节,地址为程序计数器(PC)的值。指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)=PC+已取出指令的长度。
译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作,计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可根据条件码执行跳转。
访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。
写回:最多可以写两个结果到寄存器文件。
更新PC:将PC设置成下一条指令的地址。
2、SEQ硬件结构
取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。
译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器的值valA和valB。
执行:根据指令类型将算数/逻辑单元(ALU)用于不同的目的。条件码寄存器有三个条件码位,ALU负责计算条件码的新值,当执行跳转指令时会根据条件码和跳转类型来计算分支信号Cnd。
访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但用于不同的目的。
写回:寄存器文件有两个写端口,E用来写ALU计算出来的值,M用来写从数据存储器中读出来的值。
3、SEQ时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟存储器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
4、SEQ阶段的实现
取指阶段:包括指令存储器硬件单元。
译码和写回阶段:寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。
执行阶段:算数逻辑单元(ALU),输出为valE信号。
访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生控制信号表明应该执行读还是写操作。当执行读操作时,数据存储器产生valM。
更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
例题分析和问题:
4.1:
用Y86模拟器编译:
这道题是要把指令序列转换成字节编码。做法就是先根据图4-2找出每个指令对应的字节编码,然后按照其格式和规定,参照图4-3中功能码和4-4中寄存器名字对应的数字,完成每行指令的转换。
比如:第2行的 irmovl $15,%ebx
先看irmovl对应的格式,应该是30FrBV,所以,只要知道rB和V对应的字节编码即可,根据图4-4查得%ebx是3,V对应$15。这里要注意的就是在把15转换成16进制数的时候,先把它写成16进制数,然后在前面补0,补成4字节的数。所以$15就是0000000f,然后再采用小顶端法,把字节以相反的顺序出现,就是0f000000。
所以,第二行命令对应的字节编码就是30f30f000000.
这样算出来第二行的指令需要6个字节,起始地址位0x100,所以到第三行对应的地址就是0x106。用这种方法类推,第四行的地址是0x108。同样使用小顶端法,所以最后一行jmp loop的字节编码就是7008010000.
4.2:
这道题和4.1相当于是反过程,根据字节编码来判断命令。
以A为例:先看第一个数字,是3,所以就应该是irmovl V,rB这一类型。对应可知rB是%ebx,V的16进制数表示是fcffffff,转换成10进制是-4。所以,这段字节编码对应的指令是irmovl $-4,%ebx。
用这种方法类推,可以发现C中的f0和E中的a0f0是不合法值。
4.5:
4.6
代码托管:
https://git.oschina.net/20144303sys/work
总结:
这周主要重点学习了4.1、4.2和4.3,在安装了Y86模拟器后,有了更多的实践过程。安装Y86模拟器和之前安装git都是参考同学的博客,一步一步实现的。希望下一次自己也有机会可以写一个这样的教程供大家参考使用,实现一下自我价值。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 20/20 | |
第二周 | 300/300 | 1/2 | 20/40 | |
第三周 | 300/600 | 1/3 | 20/60 | |
第五周 | 200/800 | 2/5 | 20/80 | |
第六周 | 100/900 | 2/7 | 20/80 |