1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

ch3-02: 内容重构

This commit is contained in:
chai2010 2018-07-21 13:40:45 +08:00
parent 3151d1fe2f
commit 2c9b47f355

View File

@ -88,12 +88,18 @@ X86其实是是80X86的简称后面三个字母包括Intel 8086、80286
![](../images/ch3-arch-amd64-01.ditaa.png) ![](../images/ch3-arch-amd64-01.ditaa.png)
CPU是由指令和寄存器组成其中指令是CPU内置的算法而寄存器是指令对应的算法要操作的数据结构。因此寄存器是CPU中最重要的资源每个要处理的内存数据原则上需要先放到寄存器中才能由CPU处理同时寄存器中处理完的结果需要再存入内存。X86中除了状态寄存器FLAGS和指令寄存器IP两个特殊的寄存器外还有AX、BX、CX、DX、SI、DI、BP、SP几个通用寄存器。在X86-64中又增加了八个以R8-R15方式命名的通用寄存器。因为历史的原因R0-R7并不是通用寄存器它们只是X87开始引入的MMX指令专有的寄存器。在通用寄存器中BP和SP是两个比较特殊的寄存器其中BP用于记录当前函数帧的开始位置和函数调用相关的指令会隐式地影响SP的值SP则对应当前栈指针的位置和栈相关的指令会隐式地影响SP的值而某些调试工具需要BP寄存器才能正常工作。 左边是内存部分是常见的内存布局。其中text一般对应代码段用于存储要执行指令数据代码段一般是只读的。然后是rodata和data数据段数据段一般用于存放全局的数据其中rodata是只读的数据段。而heap段则用于管理动态的数据stack段用于管理每个函数调用时相关的数据。在汇编语言中一般重点关注text代码段和data数据段因此Go汇编语言中专门提供了对应TEXT和DATA命令用于定义代码和数据。
中间是X86提供的寄存器。寄存器是CPU中最重要的资源每个要处理的内存数据原则上需要先放到寄存器中才能由CPU处理同时寄存器中处理完的结果需要再存入内存。X86中除了状态寄存器FLAGS和指令寄存器IP两个特殊的寄存器外还有AX、BX、CX、DX、SI、DI、BP、SP几个通用寄存器。在X86-64中又增加了八个以R8-R15方式命名的通用寄存器。因为历史的原因R0-R7并不是通用寄存器它们只是X87开始引入的MMX指令专有的寄存器。在通用寄存器中BP和SP是两个比较特殊的寄存器其中BP用于记录当前函数帧的开始位置和函数调用相关的指令会隐式地影响SP的值SP则对应当前栈指针的位置和栈相关的指令会隐式地影响SP的值而某些调试工具需要BP寄存器才能正常工作。
右边是X86的指令集。CPU是由指令和寄存器组成指令是每个CPU内置的算法指令处理的对象就是全部的寄存器和内存。我们可以将每个指令看作是CPU内置标准库中提供的一个个函数然后基于这些函数构造更复杂的程序的过程就是用汇编语言编程的过程。
## Go汇编中的伪寄存器 ## Go汇编中的伪寄存器
Go汇编为了简化汇编代码的编写引入了PC、FP、SP、SB四个伪寄存器。四个伪寄存器和X86/AMD64的内存和寄存器的相互关系如下图 Go汇编为了简化汇编代码的编写引入了PC、FP、SP、SB四个伪寄存器。四个伪寄存器加其它的通用寄存器就是Go汇编语言对CPU的重新抽象该抽象的结构也适用于其它非X86类型的体系结构。
四个伪寄存器和X86/AMD64的内存和寄存器的相互关系如下图
![](../images/ch3-arch-amd64-02.ditaa.png) ![](../images/ch3-arch-amd64-02.ditaa.png)