From 166d3a9de9dfa5d40242028701af2b907fba02fc Mon Sep 17 00:00:00 2001 From: Void-Deer Date: Thu, 2 Apr 2026 09:46:31 +0800 Subject: [PATCH] fix image link --- CMU-CSAPP/L07 Procedures 函数的调用.md | 2 +- CMU-CSAPP/L08 Data.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CMU-CSAPP/L07 Procedures 函数的调用.md b/CMU-CSAPP/L07 Procedures 函数的调用.md index 4aeb57b..0340ebf 100644 --- a/CMU-CSAPP/L07 Procedures 函数的调用.md +++ b/CMU-CSAPP/L07 Procedures 函数的调用.md @@ -23,7 +23,7 @@ 在画图时,栈底通常画在上方。 在内存地址视角中,栈底对应较高地址,因此按地址从低到高展示时,栈底会出现在下方。 -![栈结构示意图](/CSAPP/images/L07%20Stack%20Picture.png) +![栈结构示意图](/CMU-CSAPP/images/L07%20Stack%20Picture.png) #### 表 1:栈底在上(高地址在上) diff --git a/CMU-CSAPP/L08 Data.md b/CMU-CSAPP/L08 Data.md index fa9c4e0..a23aa48 100644 --- a/CMU-CSAPP/L08 Data.md +++ b/CMU-CSAPP/L08 Data.md @@ -70,8 +70,8 @@ get_num: # 这是Debug配置下的编译结果,因此略显冗长 概念如图所示: -![指针与数组概念辨析 内存图示](/CSAPP/images/L08%20Array%20&%20Pointer%201.png) -![指针与数组概念辨析 图例](/CSAPP/images/L08%20Array%20&%20Pointer%202.png) +![指针与数组概念辨析 内存图示](/CMU-CSAPP/images/L08%20Array%20&%20Pointer%201.png) +![指针与数组概念辨析 图例](/CMU-CSAPP/images/L08%20Array%20&%20Pointer%202.png) #### 内存中的二维数组 @@ -88,7 +88,7 @@ get_num: # 这是Debug配置下的编译结果,因此略显冗长 ``` 这个数组在内存中存储的顺序如图: -![二维数组在内存中的存储顺序](/CSAPP/images/L08%20Multi%20Demonsion%20Array%20Memory.png) +![二维数组在内存中的存储顺序](/CMU-CSAPP/images/L08%20Multi%20Demonsion%20Array%20Memory.png) 也可以以这样的方式理解那个二维数组: @@ -148,7 +148,7 @@ get_num_from_2d_arr: # assume: arr -> %rdi, row -> %esi, col -> %edx ``` 它也可以用get_num_from_2d_arr C语言函数来获取对应位置的数据,但**在内存中的情况完全不同**。它的内存布局长这样: -![存有指向一维数组的指针的一维数组的内存布局](/CSAPP/images/L08%20Array%20Pointer%20Array%20Memory.png) +![存有指向一维数组的指针的一维数组的内存布局](/CMU-CSAPP/images/L08%20Array%20Pointer%20Array%20Memory.png) ## Structures 结构体 @@ -166,7 +166,7 @@ struct structExample }; ``` -![结构体的内存布局](/CSAPP/images/L08%20Struct%20Example%20Memory%20Layout.png) +![结构体的内存布局](/CMU-CSAPP/images/L08%20Struct%20Example%20Memory%20Layout.png) 因此,对结构体的访问也很简单。编译器直接“按图索骥”,根据定义找到对应的偏移量就行了。 @@ -208,7 +208,7 @@ struct badStruct }; ``` -![badStruct的内存布局](/CSAPP/images/L08%20Bad%20Struct%20Memory%20Layout.png) +![badStruct的内存布局](/CMU-CSAPP/images/L08%20Bad%20Struct%20Memory%20Layout.png) 它足足空出来了8个字节的空间没有使用!这使得它的总大小达到了24字节。 如果我们稍稍改动一下排布顺序...... @@ -223,7 +223,7 @@ struct goodStruct }; ``` -![goodStruct的内存布局](/CSAPP/images/L08%20Good%20Struct%20Memory%20Layout.png) +![goodStruct的内存布局](/CMU-CSAPP/images/L08%20Good%20Struct%20Memory%20Layout.png) 这样子,我们只需要1个字节的填充。结构体的总大小也因此减少到了16字节。 通常来说,将结构体成员按照**从大到小**的顺序排列,可以最大程度地减少填充字节的数量。 @@ -255,13 +255,13 @@ add_doubles: - ```addps```:对两个寄存器内的所有单精度浮点数进行加法运算 它们的图解如下图所示: -![addss和addps指令的图解](/CSAPP/images/L08%20ADDSS%20&%20ADDPS%20Diagram%20.png) +![addss和addps指令的图解](/CMU-CSAPP/images/L08%20ADDSS%20&%20ADDPS%20Diagram%20.png) *这里使用了SSE的128位寄存器来演示```addss```和```addps```指令的功能。对于AVX的256位寄存器,```addss```和```addps```指令的功能是一样的,只不过它们可以同时处理更多的浮点数。* - ```addsd```:对两个寄存器内的第一个双精度浮点数进行加法运算 - ```addpd```:对两个寄存器内的所有双精度浮点数进行加法运算 -![addsd指令的图解](/CSAPP/images/L08%20ADDSD%20Diagram.png) +![addsd指令的图解](/CMU-CSAPP/images/L08%20ADDSD%20Diagram.png) 有了前面```addss```和```addps```的图解,```addsd```就不难理解了。它们的区别在于处理的数据类型不同,```addss```和```addps```处理单精度浮点数,而```addsd```和```addpd```处理双精度浮点数。 与此类似,```addpd```指令可以同时处理两个寄存器内的所有双精度浮点数进行加法运算。对于AVX的256位寄存器,```addpd```可以同时处理四个双精度浮点数进行加法运算。