3.61家庭作业与20135316合作

3.61

题中代码在循环时会产生6个临时的变量,故共需要六个寄存器在存放数据,但是由于处理器的六个寄存器中,%esp和%ebp不能用于存放临时数据,而且另外一个寄存器还必须用来保存乘法指令的结果。因此必须将循环中的值的数量减少到5个。

当没有足够多的寄存器来保存临时数据时,编译器必须把一些局部变量放到存储器中

由于在每次循环中代码从存储器中取出N的值进行检查循环是否终止,所以我觉得可以去掉每次的减产环节,直接用立即数来控制循环结束。代码如下:

int var_prod_ele(int n, int A[n][n], int B[n][n], int i, int k) {     int j = n-1;     int result = 0;     for(; j!=-1; --j)         result += A[i][j] * B[j][k];     return result; }

但是这样得到的结果仍然会使用到存储器。

按下面的代码,循环里面貌似就没有用到存储器。

但是用到了一个常量4,就是增加a的时候,会add 4。

只需要result,a,e,b,4n这五个变量。

思路如下,先初始化A数组的行和B数组的列,记住他们的地址,同时记住A数组那一行最后一个元素的地址,之后循环每次用变换的A数组行地址和A数组最后一个元素地址进行比较来控制循环的结束。若没有到达A数组行的最后一个元素,则A数组依次向后移动,B数组依次向下移动,直到最后达到最后一个元素。代码如下:

int var_prod_ele(int n, int A[n][n], int B[n][n], int i, int k) {     int result = 0;     int *a = &A[i][0];     int *b = &B[0][k];     int *e = &A[i][n];     for(;a!=e;)     {         result += *a * *b;         b+=n;         a++;   }     return result; }

3.63

E1和E2是用#define声明的宏表达式,用参数表示A矩阵的维度。

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;

}

1.分析通过信息交换所得的观察。

最常用于协议逆向工程,涉及使用总线分析器和数据包嗅探器。在接入计算机总线或网络的连接,并成功截取通信数据后,可以对总线或网络行为进行分析,以制造出拥有相同行为的通信实现。此法特别适用于设备驱动程序的逆向工程。有时,由硬件制造商特意所做的工具,如JTAG端口或各种调试工具,也有助于嵌入式系统的逆向工程。对于微软的Windows系统,受欢迎的底层调试器有SoftICE

2.反汇编,即使用反汇编器,把程序的原始机器码,翻译成较便于阅读理解的汇编代码。这适用于任何的计算机程序,对不熟悉机器码的人特别有用。流行的相关工具有OllyDebugIDA

3.反编译,即使用反编译器,尝试从程序的机器码或字节码,重现高级语言形式的源代码。

E1(n)在esi中,esi = 3n。

E2(n)在ebx中,ebx = 4*E2(n) = 4*(2n-1)。

所以E2(n) = 2n-1。

时间: 2024-10-26 20:14:12

3.61家庭作业与20135316合作的相关文章

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=r

家庭作业——第三章

第三章家庭作业    3.69和3.70 3.69 A:long trace(tree_ptr tp)    {        long ret = 0;        while(tp != NULL)        {           ret = tp->val;           tp = tp->left;        }        return ret;    } B:作用是从根一直遍历左子树,找到第一个没有左子树的节点的值. 3.70 A:long traverse(t

关于本周家庭作业

本周家庭作业 是仿照老师给的网页图片做像素级还原. 个人认为,其中涉及到的知识点有: 1. 语义化标签的用法: 2. 表单的用法以及其属性的意义: 3. 相对定位的用法: 4. 浮动的操作: 5. 浮动的清除方式: 采用overflow不等于visible的方式 采用clear方式 使用伪类:after方式 6. 无序列表的用法: 7. 二级菜单的制作:(此处不会,只好等着老师来讲解,已查过资料,主要归结为自己太笨……) 8. display各个属性的意义及用法: 9. sprinte图片切割的

信息安全系统设计基础家庭作业

<深入理解计算机系统>家庭作业 * 8.9 答案: 进程对 是否并发 AB 否 AC 是 AD 是 BC 是 BD 是 CD 是 * 8.10 答案: A. 调用一次,返回两次: fork B. 调用一次,从不返回: execve, longjmp C. 调用一次,返回一次或者多次: setjmp * 8.11 答案: 这个程序会输出4个“hello”输出行. 因为Fork()函数的作用是调用一次返回两次.根据条件i<2,当 i = 0 时,输出2个hello,当 i = 1 时,输出2

家庭作业汇总

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

20135206于佳心-家庭作业3.63

第三章家庭作业 选题: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

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]; }

20135306、20135307家庭作业3.70答案

家庭作业3.70 (1)生成以上代码的C版本 Long  traverse(tree_ptr tp) { Long  v = MAX_LONG, rv, lv; If (tp != NULL) { lv = traverse(tp->left); rv = traverse(tp->right); v = lv < rv ? lv : rv  //Line16 cmovle: if(r12<rax) rax=r12; v = v > tp->v ? tp->v :

奋战4小时的家庭作业

#include<stdio.h>int main(viod) { int a,b,c,max,min,mid,stemp1,stemp2,stemp3; printf("请输入三个数,用逗号分隔"); scanf("%d,%d,%d",&a,&b,&c); max=a; max=max>b?max:b; max=max>c?max:c; min=c; min=min<b?min:b; min=min<a?