1
- $CPI=50\%\times1+40\%\times2.5+10\%\times5=2$
-
$T=\frac Nf\cdot CPI=\frac{2N}f$
-
$CPI_2=50\%\times0.6+40\%\times2.5+10\%\times5=1.8$
运行时间降低为原来的 90% - $CPI_3=50\%\times1+40\%\times x+10\%\times5=1.8$
$x=2$
乘法指令的 $CPI$ 应变为 $2$ - $CPI_4=50\%\times1+40\%\times 2+10\%\times y=1.8$
$y=3$
访存指令的 $CPI$ 应变为 $3$
需要优化 40%,而优化乘法指令仅需优化 20%
2
-
$x5=20$
-
//int x6=10; while(x6!=0){ x6-=1; acc+=2; } return; -
$4N+1$ 条
-
程序会多循环一次,x6 最后会停在 -1 而不是 0.
3
对于程序
lb x6, 0(x7)
sb x6, 8(x7)
0x11, 按照大端定义,0x10000000 存储0x110x88, 按照小端定义,0x10000000 存储0x88
4
参考 https://gh0st.cn/Binary-Learning/PE%E5%9F%BA%E7%A1%80.html
PE 文件分为 DOS 部分,PE 文件头、节表、节数据 四个部分。
DOS 部分的头部是 DOS 头,用于兼容 16 位操作系统,现已弃用。DOS 头的开头是 magic number 0x5a4d, 结尾处存储了 PE 文件头开始的位置。
DOS 头后面是 DOS 块,是原本 16 位应用程序存放的地方,现在一般以一个打印不兼容信息的小程序填充。
接下来是 PE 文件头。PE 文件头的头部是 magic number 0x00004550, 随后是标准 PE 头和拓展 PE 头。
标准 PE 头存储了该程序能运行在什么机器上、编译时间、节数量、一些文件数据与调试信息、以及拓展 PE 头的大小。
拓展 PE 头存储了很多运行时需要的信息。比较重要的有 ImageBase 存储了 PE 文件在内存中按内存对齐展开后的首地址,AddressOfEntryPoint 存储了当前程序入口的地址、对齐大小、初始堆栈大小、各个部分加载进内存后的大小等等。
接下来是节表。节表的数量由标准 PE 头指定。节表存储了节数据在文件中的位置、在内存中的位置、加载进内存后的大小、RWX 属性等。
接下来是节数据。一般有 .text, .data, .rdara, .rsrc 等。
拓展 PE 头的最后存储了导入表、导出表、重定位表的位置与大小。导出表存储着该 PE 文件提供给其他人使用的函数列表。导入表则存储着该PE 文件所需要用到的 PE 文件列表。重定位表存储了该 PE 文件提供模块给其它程序时,哪些地方的程序需要重定位硬编码地址。
发表回复