20135223何伟钦—家庭作业汇总

第二章家庭作业

(当时检查的时候已有同学选了这道题,重复不算,没有登记)

第三章家庭作业

(已到老师办公室检查)

3.54解析:
此题较为简单,只要对号入座,即可写出相应的C语言代码
int decode2(int x,int y,int z)
{
int r;
z-=y;
r=z;
r<<=15;
r>>=15;
return r*(z^x);
}

3.56解析:

(1)由C代码函数的定义可先猜测得%esi=x,%ebx=n;
由result、mask初始化以循环表达式的mask的使用可得%edi=result,%edx为mask,即是:

寄存器 变量
esi x
ebx n
edi result
edx mask

(2)
将十进制数$1431655765转化为十六进制数
result:0x55555555
将十进制数$-21474836648转化为十六进制数
mask:0x80000000

(3)
test %edx,%edx
jne .L2
可以得出循环条件表达式为
mask !=0

(4)

汇编代码第十行:(shrl %cl,%ecx)可以看出逻辑右移了n位

(5)

汇编代码第7行和第八行代码可得
result ^= (mask & x)

(6)

int loop(int x, int n)

{
int result = 0x55555555;//或者$1431655765
int mask;
for(mask = 1<<31; mask != 0; mask = ((unsigned)mask>>n)
{
result ^= (mask & x);
}
return result;
}

3.62解析:
(1)M的值:M = 76 / 4 = 19
(2)由cmpl = %edi,%ecx;
jl .L3;
意思是:比较%edi和%ecx的值,如果(%ecx-%edi)< 0 ,将继续进入L3循环;
根据题目所给代码的内循环条件表达式for(;j<i;)(即循环条件为(j-i)<0),可以确定%edi保存i,%ecx保存j.
(3)
int transpose(int M, int A[M][M])

int i,j; 
for(i=0; i<M; ++i) 

int *a = &A[i][0]; 
int *b = &A[0][i]; 
for(j=0; j<i; ++j) 

int t = *a; 
*a = *b; 
*b = t; 
++a; 
b += M; 


}

第六章家庭作业

(合作伙伴在博客园小组已登记)

一、家庭作业6.36(20135203&&20135223)

(由于题6.36与6.35基本题型一样,只是高速缓存的数据字节不一样,我直接把6.35题目修改后作为6.36题目)

考虑下面的矩阵转置函数:

typedef	int array[4][4];
void transpose2(array dst,array src)
{
	int i,j;

	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			dst[i][j]=src[j][i];
		}
	}
}

假设这段代码运行在一台具有如下属性的机器上:

  • sizeof(int)==4。
  • 数组src从地址0开始,而数组dst从地址64开始(十进制)。
  • 只有一个L1数据高速缓存,它是直接映射、直写、写分配的,块大小为16字节。
  • 对于一个总大小为128数据字节的高速缓存,初始为空。
  • 对src和dst数组的访问分别是读和写不命中的唯一来源。

对于每个row和col,指明对src[row][col]和dst[row][col]的访问是命中(h)还是不命中(m)。

分析:

(1)对于写分配的高速缓存,每次写不命中时,需要读取数据到高速缓存中。

该高速缓存只有 2 个组,src[0] src[2] 对应组 0,src[1] src[3] 对应组 1。

同理,dst[0] dst[2] 对应组 0,dst[1] dst[3] 对应组 1。

(2)缓存能完全容得下两个数组,所以只会出现冷不命中。

解答:

二、家庭作业6.46(20135223(2)&&20135215(2))

解答:

void transpose(int *dst,int *src,int dim)
{
int i,j;
int im,jm;
for(i=0;i<dim-3;i+=4)
{
im = i*dim;
for(j=0;j<dim-3;j+=4)
{
jm = j*dim;

dst[jm+i]=src[im+j];
dst[jm+i+1]=src[im+dim+j];
dst[jm+i+2]=src[im+2*dim+j];
dst[jm+i+3]=src[im+3*dim+j];
dst[jm+dim+i]=src[im+j+1];
dst[jm+dim+i+1]=src[im+dim+j+1];
dst[jm+dim+i+2] =src[im+2*dim+j+1];
dst[jm+dim+i+3]=src[im+3*dim+j+1];
dst[jm+2*dim+i]=src[im+j+2];
dst[jm+2*dim+i+1]=src[im+dim+j+2];
dst[jm+2*dim+i+2]=src[im+2*dim+j+2];
dst[jm+2*dim+i+3]=src[im+3*dim+j+2];
dst[jm+3*dim+i]=src[im+dim+j+3];
dst[jm+3*dim+i+1]=src[im+dim+j+3];
dst[jm+3*dim+i+2]=src[im+2*dim+j+3];
dst[jm+3*dim+i+3]=src[im+3*dim+j+3];
}
}
for(;i<dim;i++)
for(;j<dim;j++)
dst[j*dim+i]=src[i*dim+j];
}

用10000*10000的数组测试(linux下需要取消stack的大小限制才运行这么大的数组)

书上的程序平均需要 9.301s

优化后评价需要 3.830秒

第十章家庭作业

(博客园小组已登记)

分析与解答:

        这里应该是表明,输入重定向到了foo.txt,然而3这个描述符是不存在的。

        说明foo.txt并没有单独的描述符3。 所以Shell执行的代码应该是这样的:

代码截图:

     

时间: 2024-12-23 10:59:20

20135223何伟钦—家庭作业汇总的相关文章

20135223何伟钦—第六章家庭作业

第六章作业 一.家庭作业6.36(20135203&&20135223) (由于题6.36与6.35基本题型一样,只是高速缓存的数据字节不一样,我直接把6.35题目修改后作为6.36题目) 考虑下面的矩阵转置函数: typedef int array[4][4]; void transpose2(array dst,array src) { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { dst[i][j]=src[j][i]; }

家庭作业汇总

家庭作业 8.21 首先可以看出不论是先打印子进程还是父进程都必须满足a在c的前面,b在c的前面这两种顺序. 但是由于无法判断子进程和父进程的并发序列,所以会有一下几种输出结果:acbc.abcc.bcac.bacc. 汇总 8.21 两星题 2′           共2′

20135223何伟钦—第十章家庭作业

分析与解答:         这里应该是表明,输入重定向到了foo.txt,然而3这个描述符是不存在的.         说明foo.txt并没有单独的描述符3. 所以Shell执行的代码应该是这样的: 代码截图:      

20135223何伟钦-第二章家庭作业

20135206于佳心【家庭作业汇总】

选题:3.63 分值:两分 作业过程: int sum_col(int n,int A[E1(n)][E2(n)],int j) { int i; int result = 0; for(i=0;i<E1(n);i++) result += A[i][j]; return result; } 上面是原来的代码 汇编代码 movl 8(%ebp),%edx ;edx:n leal (%edx,%edx),%eax ;eax:2n leal -1(%eax),%ecx ;ecx:2n-1 leal

20135223何伟钦—信息安全系统设计基础第十三周学习总结

学习任务: 1. 掌握三种并发的方式:进程.线程.I/O多路复用 2. 掌握线程控制及相关系统调用 3. 掌握线程同步互斥及相关系统调用 1.并发的意义 概念:只要逻辑控制流在时间上重叠,那么就可以称为并发. 意义: 访问慢速设备(如I/O设备):[CPU可以在这样的慢速中“腾出手”再去做其他事情,使自己保持“繁忙”.] 与人交互:每次用户进行某种操作的请求的时候[用户不会在意在自己进行操作的时候系统是否还处理着其他程序],一个独立的逻辑并发流被用来处理这个程序. 通过推迟工作来降低延迟 服务多

20135223何伟钦—信息安全系统设计基础第五周学习总结

第三章 程序的机器级表示 一.历史观点 Intel处理器(X86) 二.程序编码 gcc -01 -o p p1.c p2.c ①编译选项-01 表示编译器使用第一级优化 ②编译选项-02 表示编译器使用第二级优化(较好的选择) ③-o 表示分别将p1.c和p2.c编译后的可执行文件命名为p GCC将源代码转化为可执行代码的步骤: C预处理器:扩展源代码,插入所有#include命令指定的文件,并扩展生成.i文件 编译器:产生两个源代码的汇编代码,生成.s文件 汇编器:将汇编代码转化成二进制目标

20135223何伟钦—信息安全系统设计基础第三周学习总结

信息的表示和处理 2.0三种数字表示 无符号:编码基于传统的二进制表示法,表示大于或者等于零的数字. 补码:编码是表示有符号整数的最常见的方式,有 符号整数就是可以为正或者为负的数字. 浮点数:编码是表示实数的科学记数法 的以二为基数的版本. 溢出(overflow)的例子:使用 32 位来表示数据类型int,计算表达式200*300*400*500会得出结果 -884 901 888. 这违背了整数运算的特性,计算一组正数的乘积不应产生一个为负的结果. 2.1信息存储 机器级程序将存储器视为一

20135223何伟钦—信息安全系统设计基础第九周学习总结

学习目的: 1. 掌握系统编程和系统调用的概念 2. 掌握系统编程错误处理的方式 3. 掌握Unix/Linux系统级I/O(open close read write seek stat) 4. 掌握RIO 5. 掌握I/O重定向的方法 一.Unix I/O Unix I/O定义:所有的I/O设备都被模型化为文件,所有的输入和输出都被当作 对相应文件的读和写来执行.这种将设备影射为文件的方式,称为Unix I/O (一)打开文件 (1)文件描述符:一个应用程序通过要求内核打开相应的文件,来宣告