深入理解计算机系统笔记.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入理解计算机系统笔记

1 C中return值得低32位放在eax寄存器中,高32位放在edx寄存器中。Ebp表示帧指针,esp表示栈指针,eip寄存器是程序计数器,用来记录程序转变成的二进制码的位置。2Leal 表示取地址的意思。()表示的意思是将括号中的数最为地址,取出该地址中的数Eg:(%edx,%eax,2)的意思是加入寄存器eax中的数为x,寄存器edx中的数为y那么该指令表示:取出地址为(2*x+y)中所存储的数据;而leal(%edx,%eax,2)表示为取出地址为(2*x+y)中所存储的数据所对应的地址,即2*x+y34C语言允许对指针进行运算,而计算出来的值会根据该指针引用的数据类型的大小进行伸缩。Eg:int A[i]对于数组名A表示的数组的起始地址,是一个指针,A[i]实际的地址是A+4*i,但是在C中可以表示为:A[i] = *(A+i)5IntA[5][3] 等同于:Typdefintrow3_t[3]Row3_t A[5]表明,对于C的数组定义的时候,先定义的是A[i][j]中的j,也就是说,C中在数组的存储上是按照j维度连续的,进一步说,C中的数组是按照数组中最后一个维度连续的。这与Fortran恰恰相反。C中A[2][1]表示二列第一行。对于int A[i][j] 中A[i][j]的存储器地址为:A+4*(i*C+j)其中C是j的最大值也就是一列有多长。6Comp和test两个操作不改变寄存器中的值,但会改变标志位中的值7在C结构体重间接引用指针表示为 (*a).para1一定要加上括号另一种表示方式为:a-para17????struct和typdef:Typdef需要在新定义的数据类型前面加上已经存在的数据类型,Struct不需要,因为在struct内部都有定义;Struct在定义结束的大括号后面可以加上一个名字表示这个结构体叫做这个名字。Eg:Struct prob {……} a;等同于:Struct prob {……} Struct prob a;这里struct prob可以看成一种数据类型,相当于int后边的a是具体的,数据类型为struct prob的数当间接引用指针的时候:struct prob *p*p = a (注意,数组变量符号表示数组首地址,可是结构体不是所以要在a前面加上)如果:Struct prob {……} 最后的大括号后面以及下一行都没有定义一个为Struct prob类型的变量的话,则:struct prob *p这个间接引用的指针只指向上边这个结构体,因为只有这一个。8.用户程序在地址中存储是从低位到高位的顺序小端法存储数据,是将数据的低位到高位依次存入低地址到高地址中大端法相反。9Union和struct的区别在于在union结构内,所有单独定义的量的地址都是从首地址开始的,所以union相对于struct可以节省空间(因为在有些需求中需要用到结构内的所有量,也就是说结构中的一些量是用来提供一个选择,可以引用这个结构时每次只能选一个选择,这时候union就是在你选择之后只给你选择的这一项空间)1011C中函数名表示的就是地址,同数组名一样,不同于结构体名所以int (*f)(int*)表示的是一个指向参数为指向int型指针且返回值为int型的函数的指针用汇编的思想去理解就是,函数是一个过程,调用这个过程之后但还没有进入过程内(也就是call之后)在程序栈会将参数入栈。然后进入过程后开始给被调用的过程开辟对应的栈帧(将之前的帧指针入栈,将要保留的寄存器ebx中的值入栈,然后将栈指针移动到相应的位置)。在用指针指向函数时,如笔记10中所示,将函数fun赋值给指针,也就是将函数起始地址赋值给指针,也就是将保存下来的帧指针赋值给指针fp。12注意:程序内char *dest = s 表示的是定义一个名为dest的指针,这个指针指向地址中存的数据是char型的,并且地址为s ;而如果先定义char *dest;下一句:*dest = s表示的是指针指向的地址中存的数据值为s。13优先级:具体见链接:14eof是end of file的缩写“!=EOF”表示文件还没有结束“=EOF” 表示到文件末尾了。你在用函数读入文件数据的时候,函数总会返回一个状态,是读取成功还是失败,那么这个状态怎么表示呢,所以就约定俗成定义一个标识符表示这个状态,就有了EOF15C语言中,一个被调用的过程(一个子函数),如果:Int sum(int a)返回值为int型的数;Int *sum(int a)返回值为int型指针16C语言字符串。strlen得到的是字符串长度,这个长度不包含最后的\0结束字符,所以实际字符串num占用的内存空间为strlen(num)+1个字节,可以通过num[n]的方式访问最后的\0字符

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档