- 博客(124)
- 收藏
- 关注
原创 栈破坏检测
buf在%ebp-20位置处,v在%ebp-24位置处,v比buf更靠近栈顶,buf数组溢出不会破坏v的值,会破坏金丝雀值,经过检查金丝雀值有无改变,就可以判断有无溢出发生。带保护者,v在%ebp-24位置处,buf在%ebp-20位置处。金丝雀值在%ebp-8位置处。B. 在有保护的代码中,对局部变量重新排列如何提供更好的安全性,以对抗缓冲区溢出攻击。不带保护者,v在%ebp-8位置处,buf在%ebp-20位置处。A. 对于两个版本:buf、v和金丝雀值分别在栈中什么位置?
2025-08-09 15:56:03
95
原创 希尔排序算法应用
希尔排序算法思想: 对于n个无序数据,以小于n的整数d为距离,使用直接插入法,让距离为d的元素有序排列。减小d,继续使用直接插入法,让距离为d的元素有序排列。当d减为1,再使用直接插入法就能把这n个数据变为有序数列。
2025-07-25 11:23:48
82
原创 快速排序法应用
快速排序法的基本思路:有n个无序数据,以第1个数据为基准,比该数据小的数据放到它左边,比该数据大的数据放到其右边。然后对这两部分数据继续进行这样的排序,直到每个部分为空或者只有一个数据时,排序结束。
2025-07-24 11:35:03
111
原创 堆排序法应用
堆排序的基本思路:先构建堆,然后把根节点和最后一个节点交换,除去最后一个节点,剩余节点再构建堆,再一次把根节点和最后一个节点交换,一直到剩余节点数小于等于2时,排序结束。要实现从小到大的顺序排列元素,每个父节点的值大于或等于其任意一个子节点的值;要实现从大到小的顺序排列元素,每个父节点的值小于或等于其任意一个子节点的值。堆排序是一种选择排序算法,堆排序是利用堆的特性进行排序的过程。通常堆的数据结构是二叉堆。堆的特点是根节点的值最大(或最小),且根节点的两个子树也是堆。
2025-07-23 14:18:31
140
原创 程序可能的输出
父进程先执行printf("x=%d\n", ++x);后执行 printf("x=%d\n", --x);子进程只执行printf("x=%d\n", --x);
2025-07-18 16:39:59
143
原创 重定位条目信息
B. 确定当模块被重定位时,链接器将修改.data中的哪些数据目标。对于每条这样的指令,列出它的重定位条目中的信息:节偏移、A. 确定当模块被重定位时,链接器将修改.text中的哪些指令。对于每条这样的指令,列出它的重定位条目中的信息:节偏移、b) 可重定位目标文件的.text节。c) 可重定位目标文件的.data节。图1是程序C代码及可重定位目标文件的.text节和.data节。节偏移 : 0x000000004。重定位类型: R_386_32。符号名字: x。
2025-07-18 10:37:35
139
原创 静态链接器
在命令行中,如果定义一个符号的库出现在引用这个符号的目标文件之前,那么引用就不能被解析,链接就会失败。关于库的一般总则:将库放在命令行的结尾。另一方面,如果库不是相互独立的,那么它们必须排序,使得对于每个被存档文件的成员外部引用的符号s,在命令行中至少有一个s的定义是对s的引用之后的。如果需要满足依赖需求,可以在命令行上重复库。
2025-07-15 17:02:43
294
原创 链接器如何解析多重定义的全局符号
函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号。不允许有多个强符号;如果有一个强符号和多个若符号,选择强符号;如果有多个弱符号,从中任意选择一个。
2025-07-15 16:33:27
129
原创 整型数的循环左移和循环右移
整型数x,循环左移n位,n大于等于0小于16,比如,x=0x1234,n=4,则循环左移4位后,x=0x2341。n的取值范围不变,循环右移n位,比如,x=0x1234,n=4,则循环右移4位后,x=0x4123。
2025-07-10 10:43:33
150
原创 负整数的机器表示
运算结果: -12345的原码、补码和反码依次是:0xB039、 0xCFC7和0xCFC6。负整数可以表示为原码、补码和反码。
2025-07-08 10:51:24
208
原创 16进制整数转换为10进制整数
16进制整数x>0时,由低到高位分离16进制位,每分离出1位时,让其乘以权值后加到和中,一直到x=0时,得到10进制数。当16进制整数x=0时,不需要做变换;当x<0时,用0减去x绝对值的10进制数,就行。
2025-07-06 10:14:59
218
原创 旋转磁盘的价格
旋转磁盘的价格从20000年的每MB0.01美元下降到了2010年的0.0003美元。按照这种趋势延续下去,估计到哪一年可以以500美元的价格买到一个1PB(假设美元价值不变(没有通货膨胀)。
2025-07-05 15:19:35
104
原创 从磁盘上读文件所用时间
对于下面的情况,假设程序顺序地读文件的逻辑块,一个接一个,将读/写头定位到第1块上的时间是。2. 随机的情况:如果块是随机的映射到磁盘扇区的,估计读这个文件的时间。逻辑块被随机的映射到扇区上,读3000个扇区中的每一个都需要。3MB字节文件的逻辑块数量。大约需要的扇区数量是3000个。,计算得到16500ms.
2025-07-05 10:07:24
227
原创 高速缓存为什么要用中间位作索引
采用高位索引,连续的存储器块就会映射到相同的高速缓存组。如果一个程序有良好的空间局部性,顺序扫描一个数组的元素,那么,在任意时刻,高速缓存只能保存一个块大小的数组内容。高速缓存的使用效率就很低。采用中间位为索引,相邻的存储器块会映射到不同的高速缓存组。高速缓存能存储自身容量的数组片。
2025-07-03 18:14:54
185
原创 CPU从有TLB和高速缓存的系统中读字节数据
CPU执行一条读虚拟地址0x036a处字节的加载指令,MMU抽取出VPN和VPO,检查TLB命中,将缓存的PPN返还给MMU。MMU把PPN和VPO连接起来形成物理地址,然后发送物理地址给高速缓存。高速缓存从物理地址中抽取出CO、CI和CT,检测到一个命中。高速缓存把请求的数据返回给CPU。
2025-07-03 16:01:10
305
原创 判定算法在数据高速缓存上的效率
由于代码采用的是行方向上步长为 1 的引用模式,因此每条缓存行的未命中模式是:先出现一次未命中,随后出现 7 次命中。对于每对结构体,首次访问时会因缓存未预热(cold miss)而未命中,随后会有5次命中。由于每条缓存行能容纳两个结构体,因此这些引用中有一半会命中缓存,另一半则未命中。由于缓存无法容纳整个数组,在对数组后半部分进行列方向扫描时,会将在扫描前半部分时加载到缓存中的行逐出。因此,对于每一个结构体,都会出现一次未命中,随后是 3 次命中。唯一的存储器访问是对square数组中的元素。
2025-06-26 10:38:26
450
原创 组相联高速缓存的读写
高速缓存是2路组相联的(E=2),块大小为4字节(B=4),有4个组(S=4)。A. 指出用来确定CO、CI和CT的字段。B. 对于下面的存储器访问,当它们是。时,指出是高速缓存命中还是不命中。存储器访问的是1字节的字。存储器是字节寻址的。地址的宽度是12位。
2025-06-25 11:14:24
164
原创 确定数组元素在高速缓存访问的命中情况
缓存的容量不足以同时容纳这两个数组。对其中一个数组的缓存行进行引用时,会将另一个数组最近加载到缓存中的缓存行替换出去。缓存的容量足够大,能够同时容纳这两个数组,因此唯一出现的缓存未命中情况就是最初的冷未命中(即程序刚开始运行时,缓存为空,首次访问数据时产生的未命中)。
2025-06-25 10:34:29
178
原创 确定高速缓存的参数
m是物理地址的位数,C是高速缓存的大小(数据字节数),B是以字节为单位的块大小,E是相联度,S是高速缓存组数,t是标记位数, s是组索引位数,b是块偏移位数。
2025-06-25 09:38:37
132
原创 从L1中读数据需要的周期数
Intel Core i7的时钟频率为2.67GHZ,L1 d-cache的最大吞吐量为6500GB/s,估算从L1 d-cache中读一个8字节的字所需要的时间?(以CPU周期数为单位)。读一个字节需要的周期数。8个字节 = 所需周期数。
2025-06-24 17:27:55
148
原创 确定代码的高速缓存性能
SimAquarium游戏的核心是一个紧密循环(tight loop),它计算256个海藻的平均位置。在一台具有块大小为16字节(B=16),整个大小为1024字节的直接映射数据缓存的机器上测量它的高速缓存性能。
2025-06-23 11:01:32
301
原创 组相联高速缓存的读操作
地址的宽度是13位。高速缓存是2路组相联的(E=2),块大小为4字节(B=4),有8个组(S=8)。4个地址为: 0x064C、 0x064D、0x064E、 0x064F。高速缓存的内容如下图,所有的数字都是以16进制表示的。列出在组3中会命中的16进制存储器地址。存储器访问的是1字节的字。存储器是字节寻址的。
2025-06-20 09:55:33
146
原创 冒泡法排序并求交换次数
数组A有10个元素,初始化采用的是从大到小的顺序排列,要变为从小到大的顺序排列,交换次数就是。若一个数组有n个数据,要求从小到大的顺序排列,采用冒泡法实现,则元素最多交换次数为。程序执行结果cnt=45。
2025-06-17 10:11:55
158
原创 递归求和函数
递归函数rSum求数组元素的和,递归函数AbsSum1求数组元素绝对值的和,采用的是条件跳转语句,递归函数AbsSum2求数组元素绝对值的和,采用的是条件传送语句。
2025-06-16 17:29:08
126
原创 寄存器的使用
寄存器需要在主程序和过程中使用时,在被过程使用前,需要先把它们的内容入栈保存。如果只在过程中使用时,程序可直接修改这些寄存器的值。在过程的结尾,压入栈中的数据要被恢复。
2025-06-15 15:23:22
233
原创 向量的前置和
函数psum1( )中引入变量last_val保存p1[i-1],减少访问存储器的次数,提高计算效率。函数psum3( )使用循环展开,每次迭代计算数组p2三个元素,也能提高效率。
2025-06-15 11:14:25
175
原创 多项式求和
y=a0+a1*x+a2*x*x+...+an*x^n, 用for循环可以方便求得多项式y的值。使用两次循环展开,两路并行。可以提高性能。
2025-06-11 17:33:42
192
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人