实验楼学习内容总结
运行make指令后
查看目录下内容,可以看到只有.ys文件
用make all命令编译后
编译后查看目录下内容,可以看到已经有编译后的.yo文件,用vim进入后可以查看
课本第239页图4-7上的代码,在系统中叫做asum.yo,把它的内容打印在屏幕上:
其余代码测试结果相同
学习中的问题和解决过程
1.不支持第二变址寄存器和任何寄存器值的伸缩
伸缩是没有像IA32,如%eax32位,可以划分出%ax16位,还可以划分出%al,%ah
变址寄存器是指这是和IA32的比较,P113页有Imm(Eb,Es,s)的通用寻址方式,Y86不支持
2.如何将汇编码转换成字节编码
以练习题1为例.如irmovl $15,%ebx
irmovl:i表示立即数,r表示寄存器;即是将一立即数付给寄存器。
由ir可知:第一个字节:30
由$15可知:不访问任何寄存器,指示符字节F。
由%ebx可知:指示符字节3。
根据小端法,将15的十六进制反向写开为0f 00 00 00
因此,该句的字节编码是30f30f000000
3.字节编码中,左边一列的地址偏移量如何确定
以练习题2为例.如0x100:30f3fcffffff/406300080000/00 分三块
第一块30f3fcffffff
30:irmovl(6字节,下一个地址偏移量是6,所以下一个地址是0x106;6字节,所以划分到4前面)
f:立即数
3:%ebx
fcffffff:(小端法)反向写为fffffffc,即是-4
第二块406300080000(分析方法同第一块)
第三块00,即是halt停止
本条指令前的地址偏移量是依据上一条指令所占字节确定的
关于Y86指令,可以通过练习题4.1和4.2,学会看书上的图4-2,4-3,4-4
4.顺序实现时,执行的目的不同时,只是简单地加0,将一个输入传递到输出
课本图4-18第二列:rrmovl rA,rB
valE<——0+vlaA
不需要取第二个寄存器操作数,将第二个输入设为0,把它和第一个操作数相加,得到valE=0+valA=valA
练习题4.11:irmovl $128,%esp
valE<——0+128=128
和rrmovl处理方式类似
5.图4-18,valP=PC值+已取指令长度
已取指令长度:指令所占字节编码,即是字节数。
如rrmovl rA,rB
valP<——PC+2(rrmovl指令长度2字节,所以+2)
6.不是每个阶段都会进行,一些指令会跳过中间的某些阶段
译码:从寄存器文件读入
如irmovl指令,立即数寻址,用不到寄存器,所以不用译码阶段
访存:写入或读出数据从存储器
如rmmovl指令,需要将寄存器值valA写到存储器,或从存储器中读出valM,所以经历访存阶段
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 30/30 | |
第二周 | 300/500 | 1/3 | 20/50 | |
第三周 | 100/600 | 1/4 | 20/70 | |
第五周 | 300/900 | 1/5 | 30/100 | |
第六周 | 136/1036 | 1/6 | 20/120 |