深入理解计算机系统读书笔记

  • 信息的表示和处理
    •   信息存储
      •   进制之间的表示,转换。
        •   一个字节由8位组成。它的值域在不同的进制中表示不同。
        •   进制转换:二进制转换成十,十六进制---直接转换;当把2的非负整数N次幂转换成16进制的时候:十六进制的数字0表示4个二进制的0,当N表示成4i+j的时候,我们可以把X写成以0,4,8开头的数,后面接0;十六进制转换成十进制:用N连续除以16,得到的一系列余数按照从后往前的顺序组合,就成了16进制的数字。规律:进制大的数字转换成进制小的数,乘;反之:除以。
      •   字
        •   字长:指明整数和指针数据的标称大小。对于一个字长为W位的的机器而言,虚拟地址的范围为0-2的(W-1)次方。
      •   寻址和字节顺序
        •   在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
      •   表示字符串
        •   文本数据比二进制数据具有更强的平台独立性:在使用ASSIC码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。
        •   不同的机器类型使用不同的且不兼容的指令和编码方式。即使是完全一样的进程运行在不同的操作系统上也会有不同的编码规则。因此二进制代码是不兼容的,二进制代码很少能在不同的操作系统和不同机器的组合中移植。
      •   移位运算
        •   机器支持两种移位运算,一种是算术右移,一种是逻辑右移。算术右移在左端补上K个1,逻辑右移在左端补上K个0.
        •   一般有符号数据:算术右移;一般无符号:逻辑右移。
        •   操作符优先级。
    •   整数表示
      •   C语言中有符号数和无符号数之间的转换:有符号数到无符号数都是隐式转换的。
  • 程序的机器级表示
    •   GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。我们以适当的命令行选项调用编译器,编译器会产生一个以汇编代码形式表示的输出文件。
    •   程序编码
      •   gcc -01 -o p p1.c p2.c   这是一条指令。这里面-01表示第一级的优化,实际上这条指令是gcc指令,调用了一系列程序使源代码转换成可执行代码。
        过程:预处理器→编译器→汇编器→连接器。①:预处理器扩展源代码,插入所有用#include命令命名的文件,还有宏定义。②:编译器产生两个源代码的汇编代码,P1.s,p2.s。③:汇编器将汇编代码转化成二进制目标代码p1.o,p2.o;④:链接器将两个目标文件与实现库函数()例如printf)合并。
    •   数据格式
    •   访问信息
      •   一个IA32CPU有8个存储32位值的寄存器。前6个事通用寄存器,后面的2个事桢栈寄存器。前面三个和后面三个寄存器也有不同的功能。
      •   数据传送指令:将数据从一个地方复制到另一个地方的指令。
        • mov将源操作的值复制到目的操作数中,源操作数指定的是一个值(存储在寄存器或者存储器中),目的操作数指定一个位置(寄存器或者存储器地址)。movb:指定一个8位的。movw:16位。movl:32位。
          示例如图所示:
        •   pushl指令:把数据压入到栈上,popl弹出数据。他们两个都只有一个操作数。将一个双字值压入栈中,要将栈指针减4,然后将值写到新的栈顶地址。
      •   算术与逻辑操作
        •   加载有效地址:leal
          •   leal:从存储器读数到寄存器,但是实际上它根本没有引用存储器。①:将有效地址写入到目的操作数中,②:简洁的描述普通的算术操作。leal 7(%edx,%edx,4),%eax将设置寄存器的值为5x+7.

          •   汇编代码指令与C语言源代码中的顺序不同。
      •   控制
        •   P124-P148
      •   过程
        •   P149-P157
posted @ 2016-06-20 10:05  Kobe10  阅读(462)  评论(0编辑  收藏  举报