个人认为SSD6 Exercise 1是卡内基有史以来最经典的题目,本来想写一篇大家都看得懂的长篇大论,无奈时间不够,只好延续以往记流水帐的风格,把心得一条一条列出来。
心得1.从汇编的层次去理解c语言传值和传地址的区别.看实例
-
intmain(intargc,char*argv[]){
-
intstart=10;
-
intstride=3;
-
intkey3=-1;
-
intkey4=777;
-
char*msg1;
- process_key34(&key3,&key4); //传地址
- msg1=extract_message(start,stride); //传引用
-
return0;
- }
把这段代码对应的汇编为:
- process_keys34(&key3,&key4);
- lea-0x28(%ebp),%eax取key3的地址,即&key3
- mov%eax,0x4(%esp)把&key3存到%esp+4
- lea-0x24(%ebp),%eax取key4的地址,即&key4
- mov%eax,(%esp)把&key4存到%esp
- call804858d调用函数process_keys34
- msg1=extract_message1(start,stride);
- mov-0x10(%ebp),%eax取实参start的值
- mov%eax,0x4(%esp)得到start的副本,存到%esp+4
- mov-0x14(%ebp),%eax取实参stride的值
- mov%eax,(%esp)得到stride的副本,存到%esp
- call80485ba调用extract_message1方法
- mov%eax,-0xc(%ebp)把返回值赋给msg1
调用process_keys34之前和之后的栈帧结构如下:
调用前main函数的栈帧: 调用后main函数和process_keys34函数的栈帧:
%ebp <-----帧指针%ebp %ebp
....... .......
start start
stride stride
key3 key3
key4 key4
msg1 msg1
....... <-----栈指针%esp ........
&key3 <--------实参&key3
&key4 <--------实参&key4
返回地址
%ebp <-----帧指针%ebp
局部变量
...... <-----栈指针%esp
返回地址是main函数调用process_keys34后继续执行地方,如果我们想让程序执行完process_keys34后跳到其他地方,就可以修改这个返回地址,要想修改返回地址的值,必须先得到存储返回地址的那部分内存地址,在gdb里面可以通过$ebp+4得到,而在程序里面只能通过返回地址上面那个变量得到,即&key4对应的地址减1.理解了这点是解题的关键。
同理调用extrat_message之前和之后的栈帧结构如下:
调用前main函数的栈帧: 调用后main函数和extrat_message函数的栈帧:
%ebp <-----帧指针%ebp %ebp
....... .......
start start
stride stride
key3 key3
key4 key4
msg1 msg1
....... <-----栈指针%esp ........
stride的副本 <--------实参stride
start的副本 <--------实参start
返回地址
%ebp <-----帧指针%ebp
局部变量
...... <-----栈指针%esp
心得2:指针符*和地址符&的混合计算
1. (char *) data + j 与 data + j
data是一个int型的数组,data表示数组的首地址,我们知道地址其实是一个整数,任何地址都一样,一个指向int的地址和一个指向char的地址本质上是一样的,都是整数。但,c语言的编译器会区别这两种指针,如果指正ptr指向int,那么 ptr + 1 的地址为 <ptr + 4>:ptr的地址加上4个字节,如果ptr指向char,那么 ptr + 1 的地址为 <ptr + 1>:ptr的地址加上1个字节。当执行指针的加减法运算时,c语言会根据指针所指向的变量类型来确定需要加减多少地址。这里先把data强制转换成char类型的指针,那么
(char *) data + j 的真实地址是: <data + j>
data + j 的真实地址是: <data + 4*j>
2. *( (int *)&key3 + 1 ) + 1 与 *(&key3 + 1) + 1
其中 int a = 4; int * key3 = &a;所以 key3是一个指向int型的指针,也可以说key3的变量类型为(int *),那么&key3就是指向指针的指针,变量类型为(int **),比key3多了一个星号,但两者本质是一样的,都是地址,都是一个整数,都占4个字节,且加1后都会在原来的地址上再加4个字节,唯一的却别就是这两个地址存放变量的类型不同,*( (int *)&key3 + 1 )是一个int型的值,而
*(&key3 + 1)是一个(int *)的值,两者分别加1运算后,前者加1,后者加4,这就是区别。
3.指针和地址的区别
指针是变量,地址是值,指针的值本质上是一个地址
分享到:
相关推荐
本教程"卡内基SSD教程1-9chm版本"涵盖了一系列关于SSD的基础知识和实践应用,适合想要深入理解SSD工作原理和技术特性的初学者和专业人士。 一、SSD基本概念 1. SSD结构:SSD由控制器、NAND闪存芯片、缓存和接口组成...
卡内基梅隆大学(Carnegie Mellon University)的SSD7课程,全称为"System Software and Services Development 7",可能是一门关于系统软件和服务开发的高级课程,其中涵盖了数据库的相关知识。本资料集合了该课程...
总结起来,“卡内基 SSD9 软件工程 exercise exam”是一个全面覆盖软件工程各个阶段的课程,旨在培养学生的专业技能和实践能力。通过参与练习和考试,学生能够深入了解并熟练运用软件开发的最佳实践,为在快速发展的...
#### SSD5 Optional Exercise 6 - 卡内基梅隆 本题目为卡内基梅隆大学SSD5课程的一项选做练习题。题目中提到了在C++编程语言中关于对象创建与内存管理的问题。 #### 内存错误问题 描述中提到,在尝试通过指针直接...
SSD5,全称为"Software System Development and Design",是卡内基梅隆大学开设的一门课程,旨在培养学生的软件系统开发与设计能力。在这个项目中,我们关注的是一个商品竞拍系统,它涵盖了从基础数据结构到复杂业务...
从提供的信息来看,"ssd6 exercise 1 2 3 4 5 6" 涉及到六个不同部分的练习内容,而"icarnegie"可能是指课程的提供者,可能是卡内基梅隆大学(Carnegie Mellon University),以其在计算机科学领域的卓越教育而闻名...
在这个“面向对象--卡内基--ssd3”主题中,我们可以推测这可能是一门关于卡内基梅隆大学(Carnegie Mellon University)课程的练习,SSD3可能是课程代码或特定模块的标识。"exercise1"标签表明这是一个系列练习的第...
SSD3 Exercise 2是卡内基梅隆大学(Carnegie Mellon University)一门课程SSD3(可能指的是“Software System Development 3”)的第二部分练习。这个压缩包文件包含的是与该课程相关的学习材料或作业,用于帮助学生...
在IT领域,SSD6通常指的是“Solid State Drives”(固态硬盘)的第六个主要版本或课程,而"exercise4"可能是指一个关于SSD6技术的学习练习或者项目。"icarnegie"可能指的是卡内基梅隆大学(Carnegie Mellon ...
卡内基梅隆大学(Carnegie Mellon University,简称CMU)的课程“SSD3”(Software System Development 3)深入探讨了这一主题。Exercise5是该课程中一个关键的实践环节,旨在让学生深入理解并熟练运用面向对象编程...
"SSD6 EXERCISE3"很可能是指某门课程或教程中的第三个练习,专注于固态存储(SSD)或存储系统设计,并可能涉及内存分配的调试问题。"icarnegie"可能指的是卡内基梅隆大学或其他与之相关的教育资源。在这里,我们将...
SSD1,全称可能为"Solid State Drive 1",在这个上下文中,很可能是指某个在线课程、教育平台或者学习资源中的一个章节或模块,主要围绕固态硬盘(Solid State Drives)的基础知识进行教学。"Quiz"通常指的是小测验...
卡内基梅隆大学网上系列教程之SSD4(傻傻的4)
SSD3,全称为Solid State Drives 3,可能是指卡内基梅隆大学课程中关于固态存储技术的第三阶段学习内容。这份资源包含了英文版的选择题,对于正在复习这个主题的学生来说,是一个非常宝贵的练习资料。固态驱动器...
这个"ssd3_exercise6源码"是卡内基大学SSD3课程的一个实验项目,意味着它包含了一组经过测试和验证的代码,旨在帮助学生理解和实践SSD3的概念。 首先,让我们深入了解一下SSD3的核心概念。SSD3是一种用于表示和搜索...
卡内基梅隆大学网上系列教程之SSD1(傻傻的1)
【SSD5 Exercise 1 全解:深度学习与计算机视觉基础】 在计算机科学领域,尤其是人工智能和机器学习部分,SSD(Single Shot MultiBox Detector)是一种高效的深度学习模型,用于目标检测任务。SSD5通常指的是卡内基...
在学习编程和计算机科学的过程中,卡内基梅隆大学(Carnegie Mellon University)提供了多个在线课程,其中包括SSD3(Software System Development 3),这是一门深入探讨Java编程和软件系统开发的课程。本资料集...
在本练习中,我们将深入探讨数据库相关知识,这是卡内基梅隆大学SSD7(存储系统和服务)课程的一部分,即Exercise4。数据库是信息管理的核心工具,它负责组织、存储和检索数据,确保数据的一致性和安全性。下面将...
标题中的"SSD3_exercise1源码"指的是卡内基梅隆大学SSD3(Software System Development and Deployment)课程的实验1的源代码。这个实验可能涉及到软件开发的基础概念,如面向对象编程、类的设计以及系统集成。下面...