## CSAPP读书日记-第三章-1

CSAPP读书日记-第三章-1

第三章主要讲程序是如何转为汇编代码的。刚开始看这一章的时候一头雾水,觉得跟现在的工作毫无关系,因为其就是引入了一堆非常用户不友好的指令,将你的代码转变为对内存或寄存器中的地址(间接)或值(直接)的操作。强行看了后,感觉有点说不清道不明的收获。。。

先记一些知识点在下面,以作复习之用:
1.每个寄存器的容量非常之小,现在最大也就是64位,目前x86-64的CPU一共包含16个这样的寄存器(开始我还以寄存器至少能存几M的东西,现在看来,寄存器就是为了函数调用而设计的,将函数中关键的值或地址放到寄存器中)。
----这样,你可能会想,我有的方法层层调用,这点寄存器怎么够用?
但然够用啦,因为有个寄存器叫**%rsp**,其指向“栈”这个数据结构的顶部。所有的方法相关信息都放在"栈"中。至于“栈”在哪?“栈“肯定在内存啊,那地方就大了~
这里的设计精妙之处在于,“栈”是先进后出的,每次读都是读“栈”顶的元素,所以只要一个寄存器来存储“栈”顶元素的地址,就能对“栈”中的数据进行有效的访问了。

问题:----上面我虽然说“栈”是放方法的相关信息,但我现在了解到的,每个地址存的都是一个具体的值,能存操作代码吗?比如:leaq 2(%rax),%rax; 这种代码能存在"栈"中吗?

值得注意的是**:leaq并没有去读地址,而是直接拿值,**上面的(%rax)并不是间接引用。。。(吐槽一下,细节太多,我差点给整晕了0.0)

16个寄存器的图:

不知道怎么旋转图片,我也很无奈~~~

2.寄存器有直接寻址和间接寻址之分。个人的理解就是,
----“直接寻址”就是寄存器里面存的是需要的数据
----"间接寻址"就是寄存器里面存了数据的内存地址,你还要在从内存里找
再贴段代码图:
在这里插入图片描述

上面的代码是C代码,然后参数里有“*”号作为前缀,就表明是“间接引用”,所以下面的赋值操作就对其加了括号(mov相当于复制源数据,再赋值给目标数据;而%rdi表明是第一个参数)。
而第2个参数 y,前面没有星号,所以就是直接引用,movq %rsi,(%rdi) 就是把第二个参数的值覆盖第一个参数引用的内存地址那的值。

这么说吧,间接引用相当于一个key-value的结构,赋值的时候是覆盖value,而%rdi这个寄存器本身所含有的key值并没有变。

猜你喜欢

转载自blog.csdn.net/zjx130/article/details/83754561