参考教材:计算机系统基础 第二版 袁春风 机械工业出版社
参考慕课:计算机系统基础(四):编程与调试实践 https://www.icourse163.org/learn/NJU-1449521162
计算机系统实验导航
实验一:环境安装 https://blog.youkuaiyun.com/weixin_46291251/article/details/122477054
实验二:数据的存储与运算 https://blog.youkuaiyun.com/weixin_46291251/article/details/122478255
实验三:程序的机器级表示 https://blog.youkuaiyun.com/weixin_46291251/article/details/122478979
实验四:二进制程序逆向工程 https://blog.youkuaiyun.com/weixin_46291251/article/details/122479554
实验五:缓冲区溢出攻击 https://blog.youkuaiyun.com/weixin_46291251/article/details/122479798
实验六:程序的链接 https://blog.youkuaiyun.com/weixin_46291251/article/details/122480049
实验源码: xxx
准备
实验内容:
1 课程实验平台环境的安装,基本实验工具的使用;
2 从高级语言的角度展示和解释位运算、浮点数运算的精度、cache对程序性能的影响。
实验目标:
1 完成课程实验平台环境的搭建与设置;掌握常用实验工具的基本使用方法;
2 掌握C语言中位操作语句的使用;了解浮点数表示精度在浮点数运算中的影响;了解cache、数据存储与访问模式对程序性能的影响,掌握编写cache友好代码的基本原则。
实验任务:
1 学习MOOC内容
https://www.icourse163.org/learn/NJU-1449521162
- 第一周 实验与开发环境的安装和使用
第2讲 虚拟机、Linux及其上实验环境的安装
第3讲 基本实验工具的使用 - 第二周 C语言编程实践
第1讲 数据的位运算操作
第2讲 浮点数的精度问题
第3讲 Cache友好代码
2 在自己的电脑上安装实验环境
安装虚拟机软件:VirtualBox 6.0.8开源软件
安装Linux系统:Linux Debian 32位
熟悉软件工具:gcc,gdb,objdump
题目一:不使用中间变量,交换变量a和b的值
编写C语言程序,不使用中间变量,交换变量a和b的值,已知变量的初始值为a=2021,b=191,分析程序的反汇编代码,说明算法的基本原理。
程序代码和注释说明
1.#include <stdio.h>
2.#include <stdlib.h>
3.
4.int main()
5.{
6. int a=2021,b=191;
7. printf ("before swapping: a=%d, b=%d\n",a,b);
8.
9. a = a^b;
10. b = b^a;//b=b^(a^b)=a
11. a = a^b;//a=(a^b)^a=b
12. printf("after swapping: a=%d, b=%d\n",a,b);
13.}
第一步:b=b(ab)=a
第二步:a=(ab)a=b
然后就完成了数值交换并且没有使用其他中间变量。
实验结果记录
可见实现了不使用中间变量,交换变量a和b的值
题目二:编写C语言程序,说明浮点数运算误差问题,并给出解决方案。
注:可以参考kahan累加算法的例子,MOOC内容(第二周 第2讲 浮点数的精度问题);也可以采用其他算例,分析运行效果,说明算法的基本原理。
程序代码和注释说明
1.#include<stdio.h>
2.void main()
3.{
4. float sum = 0;
5. float sum1 =0;
6. float c = 0;
7. float y, t;
8. int i;
9. for (i=0;i<4000000;i++)
10. sum1+=0.1;
11.
12. for( i=0;i<4000000;i++)
13. {
14. y=0.1-c;
15. t=sum+y;
16. c = (t-sum)