深入理解计算机系统 学习笔记(1)

Hello world,hello blog!

Posted by 吴柚 on April 22, 2019

程序的机器级表示

  1. 汇编代码不区分有符号和无符号甚至指针类型。

  2. 汇编代码后缀的含义

大多数GCC生成的汇编指令都有一个字符后缀,表示操作数的大小。例如数据传送指令有三个变种:movb(传送字节)、movw(传送字)和movl(传送双字)。注意,汇编代码使用后缀’l’来表示4个字节整数和8个字节双精度浮点数,这不会产生歧义,因为浮点数使用的是一组完全不同的指令和寄存器。

操作数指示符,操作数一共有三类:1)立即数(immediate)也就是常数值,立即数的书写方式是$。例如:$0x1F。2)寄存器,3)存储器(memory).由于三种操作数的存在所以寻址方式就有很多种。

  1. 寄存器使用惯例:%eax、%edx和%ecx是调用者保存寄存器,%ebx、%esi和%edi是被调用者保存寄存器。那么,一个函数f()可能被别人调用,也可以调用其他函数,所以当f()运行时需要将%ebx、%esi和%edi保存到栈中,并在返回前再恢复它们。(p151)—》64位%rax寄存器用来保存函数的返回值,(p198)

在x86-64汇编语言,中%rax用来保存函数的返回值,而在结果返回之前,%rax可以重复利用。

  1. 栈在处理函数调用中起到至关重要的作用。图片的上半部分,说明了实际效果,即将%eax的值移动到%edx中,图片的下半部分是栈移动步骤。栈顶的变化最后关键。从0x108 -> 0x104 -> 0x108

  1. 栈帧结构,IA32程序用程序栈来支持函数调用。机器用栈来传递函数参数、返回值、保存寄存器用于以后恢复和本地存储。为单个过程分配的那部分栈成为栈帧(stack frame)。下图说了栈帧的结构。

学习目标

此书的二到七章,都是讲解计算机系统方面的问题,所以预计花一个星期的时间将这几章学完。