20145208 《信息安全系统设计基础》第6周学习总结
Y86模拟器安装教程
- 虽然实验楼中给的参考链接打不开,但是在实验楼的教学代码中有一个命令同样可以下载Y86模拟器到虚拟机中
- 使用
wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
命令可以下载sim.tar
文件到虚拟机中 - 在搜索Y86相关资料的时候,发现了一个较为详尽的Y86安装教程,参考里面的过程完成了安装(资料链接在下方已经给出,感谢博主的分享让我在安装过程中可以减少很多麻烦)
- 1.首先需要安装
bison
和flex
词法分析工具,这个可以在终端中输入sudo apt-get install bison flex
来安装。 - 2.
sim.tar
文件的下载除了实验楼中的下载方式,该博主也提供了一种,但是可能是我的网络问题,给的网页链接打不开。 - 3.如果想要看到图形化的界面需要我们自己安装Tcl/Tk
- 通过终端命令
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
来安装 - 在安装的过程中可能出现如下错误,提示资源占用的问题,使用
rm
命令关闭即可
- 通过终端命令
- 4.使用图形界面还需要对
makefile
进行改动(makefile文件在sim文件夹下)
GUIMODE=-DHAS_GUI (本来是#GUIMODE=-DHAS_GUI 的,也就是把#去掉)
TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5
TKINC=-I /usr/include/tcl8.5 (前面那个是大写的i,就是include的意思。不是小L,路径是自己虚拟机种``tk.h``和``tcl.h``文件的路径)
- 5.然后就可以通过
make *.yo
来编译文件了,也可以直接make
或make all
来编译所有的代码。
- 6.这之后就可以在
pipe
文件夹下打开终端输入./psim -t -g ../y86-code/*.yo
来使用Y86模拟器对y86-code
文件夹中的*.yo
文件进行操作了
- 以后每次可以通过将汇编代码写入
*.ys
然后用make
编译成*.yo
,然后用Y86模拟器操作
教材学习内容总结
4.1Y86指令集体系结构
- ISA:指令集体系结构,一个处理器支持的指令和指令的字节级编码程序员可见的状态
程序员可见的状态
- Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。其中包括:
- 8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
- 条件码:ZF(零)、SF(符号)、OF(有符号溢出)
- 程序计数器(PC):存放当前正在执行的指令的地址
- 存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址。
- 状态码(stat):表明程序执行的总体状态。(异常处理)
Y86指令
-
movl:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的地的格式。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(存储器 ),第二个字母代表目的,可以是r或者m。
-
两个存储器传送指令中的存储器引用方式是简单地基址和偏移量形式,即:
Imm(Eb) M[Imm+R[Eb]](基址+偏移量)寻址
-
不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。
- OPl(整数操作指令):addl、subl、andl和xorl。只对寄存器数据进行操作,同时还设置条件码。
- jXX(跳转指令):jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支。
- cmovXX(条件传送指令):cmovle、cmovl、cmove、cmovne、cmovge和comvg,与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。
- call和ret:call指令将返回地址入栈,然后跳转到目的地址。ret指令从这样的过程调用中返回。
- pushl和popl:入栈和出栈。
- halt:停止指令的执行。
指令编码
- 指令的字节级编码规则:高4位为代码部分,低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。
8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
数字 寄存器名字
0 %eax
1 %ecx
2 %edx
3 %ebx
4 %esp
5 %ebp
6 %esi
7 %edi
- 附加寄存器指示符字节:指定一个或者两个寄存器。
- 附加4字节的常数字:作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
Y86异常
状态码:描述程序执行的总体状态。
值 名字 含义
1 AOK 正常操作
2 HLT 处理器执行halt指令(指令停止)
3 ADR 遇到非法地址
4 INS 遇到非法指令
- Y86中,任何AOK以外的代码都会使处理器停止执行指令,而没有异常处理程序。
4.2逻辑设计和硬件控制语言HCL
- 实现一个数字系统需要的三个组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信号。
计算对位进行操作的函数的组合逻辑
- 逻辑门是数字电路的基本计算元素,输出等于输入位值的某个布尔函数。
- 与:out=a&&b
- 或:out=a||b
- 非:out=!a
- 异或:out=(!a)b+a(!b)
存储器和时钟
- 为了产生时序电路,必须引入按位存储信息的设备,存储设备由同一个时钟信号控制。
- 随机访问存储器:存储多个字,用地址来选择应该读写哪个字。
- 时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
- 寄存器首先保持稳定(输出等于当前状态),时钟上升沿来到时,加载输入信号。Y86处理器用时钟寄存器保存程序计数器(PC),条件代码(CC)和程序状态(Stat)。
- 寄存器文件有两个读端口(A和B),一个写端口(W),允许同时进行多端口读写操作。
课后作业中的问题和解决过程
习题4.1
- 确定下面的Y86指令序列的字节编码。.pos 0x100表明这段代码的起始地址应该是0x100
.pos 0x100
irmovl $15,%ebx
rrmovl %ebx,%ecx
loop:
rmmovl %ecx,-3(%ebx)
addl %ebx,%ecx
jmp loop
- 通过Y86模拟器清楚的看到所有的信息:
0x100: | .pos 0x100
0x100: 30f30f000000 | irmovl $15,%ebx
0x106: 2031 | rrmovl %ebx,%ecx
0x108: | loop:
0x108: 4013fdffffff | rmmovl %ecx,-3(%ebx)
0x10e: 6031 | addl %ebx,%ecx
0x110: 7008010000 | jmp loop
习题4.2
- 确定下列每一个字节序列所编码的Y86指令序列。如果有不合法字节,指出其位置。
A.
0x100:30f3fcffffff ;irmovl $-4,%ebx
0x106:406300080000 ;rmmovl %esi,0x800(%ebx)
0x10c:00 ;halt
B.
0x200:a06f ;pushl %esi
0x202:8008020000 ;call proc
0x207:00 ;halt
0x208: ;proc:
0x208:30f30a000000 ;irmovl $10,%ebx
0x20e:90 ;ret
C.
0x300:505407000000 ;mrmovl 0x7(%esp),%ebp
0x306:10 ;nop
0x307:f0 ;非法
0x308:b01f ;popl %ecx
D.
0x400: ;loop:
0x400:6113 ;subl %ecx,%ebx
0x402:7300040000 ;je loop
0x407:00 ;halt
E.
0x500:6362 ;xorl %esi,%edx
0x502:a0 ;非法
0x503:f0 ;非法
习题4.10
- 写一个电路的HCL代码,对于输入字A,B,C,选择中间值。
int Med3 = [
A<=B && A>=C :A;
A<=C && A>=B :A;
B<=A && B>=C :B;
B<=C && B>=A :B;
1 :C;
];
练习题4.17
- 写出SEQ中实现need_valC的HCL代码
bool need_valC =
icode in {IIROMVL,IRMMOVL,IMRMOVL,IJXX,ICALL};
练习题4.19
- 这段代码类似于disE的代码:
detM=[
icode in{IMRMOVL,IPOPL}:rA;
1:RNONE;
]
代码托管
代码托管链接
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 20/20 | 学会了虚拟机安装和Ubuntu的基本操作 |
第二周 | 56/56 | 1/3 | 20/40 | 学会了Ubuntu终端下的C语言编写 |
第三周 | 110/166 | 1/4 | 30/70 | 熟悉了gdb的基本操作,了解了计算机信息表示和处理 |
第四周 | 110/166 | 1/5 | 10/80 | 复习了前几周的知识 |
第五周 | 42/208 | 2/6 | 30/110 | 学习了linux下的汇编语言内容 |
第六周 | 1147/1355 | 1/7 | 30/140 | 了解了linux下Y86模拟器的使用 |