From 20d6fb7542c3547de0f746f0be8bb76c200018da Mon Sep 17 00:00:00 2001 From: chai2010 Date: Tue, 14 Aug 2018 21:54:54 +0800 Subject: [PATCH] =?UTF-8?q?ch3:=20=E8=A7=84=E8=8C=83=E5=8C=96=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch3-asm/ch3-02-arch.md | 6 +- ch3-asm/ch3-03-const-and-var.md | 8 +- ch3-asm/ch3-04-func.md | 10 +- ch3-asm/ch3-06-func-again.md | 2 +- images/ch2-qsort-v2.plantuml | 88 ------------------ images/ch2-qsort-v2.uml.png | Bin 50324 -> 0 bytes ...hsm-zero.jpg => ch3.2-1-arch-hsm-zero.jpg} | Bin ...aa.png => ch3.2-2-arch-amd64-01.ditaa.png} | Bin ...aa.txt => ch3.2-2-arch-amd64-01.ditaa.txt} | 0 ...aa.png => ch3.2-3-arch-amd64-02.ditaa.png} | Bin ...aa.txt => ch3.2-3-arch-amd64-02.ditaa.txt} | 0 ....png => ch3.3-1-pkg-var-decl-01.ditaa.png} | Bin ....txt => ch3.3-1-pkg-var-decl-01.ditaa.txt} | 0 ...ch3-03-ieee754.jpg => ch3.3-2-ieee754.jpg} | Bin ....png => ch3.3-3-pkg-var-decl-02.ditaa.png} | Bin ....txt => ch3.3-3-pkg-var-decl-02.ditaa.txt} | 0 ....png => ch3.3-4-pkg-var-decl-03.ditaa.png} | Bin ....txt => ch3.3-4-pkg-var-decl-03.ditaa.txt} | 0 ...taa.png => ch3.4-1-func-decl-01.ditaa.png} | Bin ...taa.txt => ch3.4-1-func-decl-01.ditaa.txt} | 0 ...taa.png => ch3.4-2-func-decl-02.ditaa.png} | Bin ...taa.txt => ch3.4-2-func-decl-02.ditaa.txt} | 0 ...itaa.png => ch3.4-3-func-arg-01.ditaa.png} | Bin ...itaa.txt => ch3.4-3-func-arg-01.ditaa.txt} | 0 ...ng => ch3.4-4-func-local-var-01.ditaa.png} | Bin ...xt => ch3.4-4-func-local-var-01.ditaa.txt} | 0 ...g => ch3.4-5-func-call-frame-01.ditaa.png} | Bin ...t => ch3.4-5-func-call-frame-01.ditaa.txt} | 0 ....6-1-func-stack-frame-layout-01.ditaa.png} | Bin ....6-1-func-stack-frame-layout-01.ditaa.txt} | 0 30 files changed, 13 insertions(+), 101 deletions(-) delete mode 100644 images/ch2-qsort-v2.plantuml delete mode 100644 images/ch2-qsort-v2.uml.png rename images/{ch3-02-arch-hsm-zero.jpg => ch3.2-1-arch-hsm-zero.jpg} (100%) rename images/{ch3-arch-amd64-01.ditaa.png => ch3.2-2-arch-amd64-01.ditaa.png} (100%) rename images/{ch3-arch-amd64-01.ditaa.txt => ch3.2-2-arch-amd64-01.ditaa.txt} (100%) rename images/{ch3-arch-amd64-02.ditaa.png => ch3.2-3-arch-amd64-02.ditaa.png} (100%) rename images/{ch3-arch-amd64-02.ditaa.txt => ch3.2-3-arch-amd64-02.ditaa.txt} (100%) rename images/{ch3-pkg-var-decl-01.ditaa.png => ch3.3-1-pkg-var-decl-01.ditaa.png} (100%) rename images/{ch3-pkg-var-decl-01.ditaa.txt => ch3.3-1-pkg-var-decl-01.ditaa.txt} (100%) rename images/{ch3-03-ieee754.jpg => ch3.3-2-ieee754.jpg} (100%) rename images/{ch3-pkg-var-decl-02.ditaa.png => ch3.3-3-pkg-var-decl-02.ditaa.png} (100%) rename images/{ch3-pkg-var-decl-02.ditaa.txt => ch3.3-3-pkg-var-decl-02.ditaa.txt} (100%) rename images/{ch3-pkg-var-decl-03.ditaa.png => ch3.3-4-pkg-var-decl-03.ditaa.png} (100%) rename images/{ch3-pkg-var-decl-03.ditaa.txt => ch3.3-4-pkg-var-decl-03.ditaa.txt} (100%) rename images/{ch3-func-decl-01.ditaa.png => ch3.4-1-func-decl-01.ditaa.png} (100%) rename images/{ch3-func-decl-01.ditaa.txt => ch3.4-1-func-decl-01.ditaa.txt} (100%) rename images/{ch3-func-decl-02.ditaa.png => ch3.4-2-func-decl-02.ditaa.png} (100%) rename images/{ch3-func-decl-02.ditaa.txt => ch3.4-2-func-decl-02.ditaa.txt} (100%) rename images/{ch3-func-arg-01.ditaa.png => ch3.4-3-func-arg-01.ditaa.png} (100%) rename images/{ch3-func-arg-01.ditaa.txt => ch3.4-3-func-arg-01.ditaa.txt} (100%) rename images/{ch3-func-local-var-01.ditaa.png => ch3.4-4-func-local-var-01.ditaa.png} (100%) rename images/{ch3-func-local-var-01.ditaa.txt => ch3.4-4-func-local-var-01.ditaa.txt} (100%) rename images/{ch3-func-call-frame-01.ditaa.png => ch3.4-5-func-call-frame-01.ditaa.png} (100%) rename images/{ch3-func-call-frame-01.ditaa.txt => ch3.4-5-func-call-frame-01.ditaa.txt} (100%) rename images/{ch3-func-stack-frame-layout-01.ditaa.png => ch3.6-1-func-stack-frame-layout-01.ditaa.png} (100%) rename images/{ch3-func-stack-frame-layout-01.ditaa.txt => ch3.6-1-func-stack-frame-layout-01.ditaa.txt} (100%) diff --git a/ch3-asm/ch3-02-arch.md b/ch3-asm/ch3-02-arch.md index 9532e63..8ea14b0 100644 --- a/ch3-asm/ch3-02-arch.md +++ b/ch3-asm/ch3-02-arch.md @@ -65,7 +65,7 @@ 下图是某一层的任务:将输入数据的0剔除,非0的数据依次输出,右边部分是解决方案。 -![](../images/ch3-02-arch-hsm-zero.jpg) +![](../images/ch3.2-1-arch-hsm-zero.jpg) 整个程序只有一个输入指令、一个输出指令和两个跳转指令共四个指令: @@ -86,7 +86,7 @@ X86其实是是80X86的简称(后面三个字母),包括Intel 8086、80286 在使用汇编语言之前必须要了解对应的CPU体系结构。下面是X86/AMD架构图: -![](../images/ch3-arch-amd64-01.ditaa.png) +![](../images/ch3.2-2-arch-amd64-01.ditaa.png) 左边是内存部分是常见的内存布局。其中text一般对应代码段,用于存储要执行指令数据,代码段一般是只读的。然后是rodata和data数据段,数据段一般用于存放全局的数据,其中rodata是只读的数据段。而heap段则用于管理动态的数据,stack段用于管理每个函数调用时相关的数据。在汇编语言中一般重点关注text代码段和data数据段,因此Go汇编语言中专门提供了对应TEXT和DATA命令用于定义代码和数据。 @@ -101,7 +101,7 @@ Go汇编为了简化汇编代码的编写,引入了PC、FP、SP、SB四个伪 四个伪寄存器和X86/AMD64的内存和寄存器的相互关系如下图: -![](../images/ch3-arch-amd64-02.ditaa.png) +![](../images/ch3.2-3-arch-amd64-02.ditaa.png) 在AMD64环境,伪PC寄存器其实是IP指令计数器寄存器的别名。伪FP寄存器对应的是函数的帧指针,一般用来访问函数的参数和返回值。伪SP栈指针对应的是当前函数栈帧的底部(不包括参数和返回值部分),一般用于定位局部变量。伪SP是一个比较特殊的寄存器,因为还存在一个同名的SP真寄存器。真SP寄存器对应的是栈的顶部,一般用于定位调用其它函数的参数和返回值。 diff --git a/ch3-asm/ch3-03-const-and-var.md b/ch3-asm/ch3-03-const-and-var.md index 43f0dab..fe80e90 100644 --- a/ch3-asm/ch3-03-const-and-var.md +++ b/ch3-asm/ch3-03-const-and-var.md @@ -110,7 +110,7 @@ DATA ·num+8(SB)/8,$0 下图是Go语句和汇编语句定义变量时的对应关系: -![](../images/ch3-pkg-var-decl-01.ditaa.png) +![](../images/ch3.3-1-pkg-var-decl-01.ditaa.png) 汇编代码中并不需要NOPTR标志,因为Go编译器会从Go语言语句声明的`[2]int`类型中推导出该变量内部没有指针数据。 @@ -171,7 +171,7 @@ Go汇编语言通常无法区分变量是否是浮点数类型,与之相关的 IEEE754标准中,最高位1bit为符号位,然后是指数位(指数为采用移码格式表示),然后是有效数部分(其中小数点左边的一个bit位被省略)。下图是IEEE754中float32类型浮点数的bit布局: -![](../images/ch3-03-ieee754.jpg) +![](../images/ch3.3-2-ieee754.jpg) IEEE754浮点数还有一些奇妙的特性:比如有正负两个0;除了无穷大和无穷小Inf还有非数NaN;同时如果两个浮点数有序那么对应的有符号整数也是有序的(反之则不一定成立,因为浮点数中存在的非数是不可排序的)。浮点数是程序中最难琢磨的角落,因为程序中很多手写的浮点数字面值常量根本无法精确表达,浮点数计算涉及到的误差舍入方式可能也的随机的。 @@ -300,13 +300,13 @@ func makechan(chanType *byte, size int) (hchan chan any) 首先查看前面已经见过的`[2]int`类型数组的内存布局: -![](../images/ch3-pkg-var-decl-02.ditaa.png) +![](../images/ch3.3-3-pkg-var-decl-02.ditaa.png) 变量在data段分配空间,数组的元素地址依次从低向高排列。 然后再查看下标准库图像包中`image.Point`结构体类型变量的内存布局: -![](../images/ch3-pkg-var-decl-03.ditaa.png) +![](../images/ch3.3-4-pkg-var-decl-03.ditaa.png) 变量也时在data段分配空间,变量结构体成员的地址也是依次从低向高排列。 diff --git a/ch3-asm/ch3-04-func.md b/ch3-asm/ch3-04-func.md index c969f64..5b1568b 100644 --- a/ch3-asm/ch3-04-func.md +++ b/ch3-asm/ch3-04-func.md @@ -38,7 +38,7 @@ TEXT ·Swap(SB), NOSPLIT, $0 下图是Swap函数几种不同写法的对比关系图: -![](../images/ch3-func-decl-01.ditaa.png) +![](../images/ch3.4-1-func-decl-01.ditaa.png) 第一种是最完整的写法:函数名部分包含了当前包的路径,同时指明了函数的参数大小为32个字节(对应参数和返回值的4个int类型)。第二种写法则比较简洁,省略了当前包的路径和参数的大小。如果有NOSPLIT标注,会禁止汇编器为汇编函数插入栈分裂的代码。NOSPLIT对应Go语言中的`//go:nosplit`注释。 @@ -79,7 +79,7 @@ TEXT ·Swap(SB), $0-32 下图是Swap函数中参数和返回值在内存中的布局图: -![](../images/ch3-func-decl-02.ditaa.png) +![](../images/ch3.4-2-func-decl-02.ditaa.png) 下面的代码演示了如何在汇编函数中使用参数和返回值: @@ -136,7 +136,7 @@ func Foo(FP *SomeFunc_args_and_returns) { Foo函数的参数和返回值的大小和内存布局: -![](../images/ch3-func-arg-01.ditaa.png) +![](../images/ch3.4-3-func-arg-01.ditaa.png) 下面的代码演示了Foo汇编函数参数和返回值的定位: @@ -208,7 +208,7 @@ func Foo() { 下面是Foo函数的局部变量的大小和内存布局: -![](../images/ch3-func-local-var-01.ditaa.png) +![](../images/ch3.4-4-func-local-var-01.ditaa.png) 从图中可以看出Foo函数局部变量和前一个例子中参数和返回值的内存布局是完全一样的,这也是我们故意设计的结果。但是参数和返回值是通过伪FP寄存器定位的,FP寄存器对应第一个参数的开始地址(第一个参数地址较低),因此每个变量的偏移量是正数。而局部变量是通过伪SP寄存器定位的,而伪SP寄存器对应的是第一个局部变量的结束地址(第一个局部变量地址较大),因此每个局部变量的便宜量都是负数。 @@ -239,7 +239,7 @@ func sum(a, b int) int { 下图展示了三个函数逐级调用时内存中函数参数和返回值的布局: -![](../images/ch3-func-call-frame-01.ditaa.png) +![](../images/ch3.4-5-func-call-frame-01.ditaa.png) 为了便于理解,我们对真实的内存布局进行了简化。要记住的是调用函数时,被调用函数的参数和返回值内存空间都必须由调用者提供。因此函数的局部变量和为调用其它函数准备的栈空间总和就确定了函数帧的大小。调用其它函数前调用方要选择保存相关寄存器到栈中,并在调用函数返回后选择要恢复的寄存器进行保存。最终通过CALL指令调用函数的过程和调用我们熟悉的调用println函数输出的过程类似。 diff --git a/ch3-asm/ch3-06-func-again.md b/ch3-asm/ch3-06-func-again.md index 156c5fb..f8e78ab 100644 --- a/ch3-asm/ch3-06-func-again.md +++ b/ch3-asm/ch3-06-func-again.md @@ -9,7 +9,7 @@ 和C语言函数不同,Go语言函数的参数和返回值完全通过栈传递。下面是Go函数调用时栈的布局图: -![](../images/ch3-func-stack-frame-layout-01.ditaa.png) +![](../images/ch3.6-1-func-stack-frame-layout-01.ditaa.png) 首先是调用函数前准备的输入参数和返回值空间。然后CALL指令将首先触发返回地址入栈操作。在进入到被调用函数内之后,汇编器自动插入了BP寄存器相关的指令,因此BP寄存器和返回地址是紧挨着的。再下面就是当前函数的局部变量的空间,包含再次调用其它函数需要准备的调用参数空间。被调用的函数执行RET返回指令时,先从栈恢复BP和SP寄存器,接着取出的返回地址跳转到对应的指令执行。 diff --git a/images/ch2-qsort-v2.plantuml b/images/ch2-qsort-v2.plantuml deleted file mode 100644 index 7516eae..0000000 --- a/images/ch2-qsort-v2.plantuml +++ /dev/null @@ -1,88 +0,0 @@ -' Copyright 2017 . All rights reserved. -' Use of this source code is governed by a Apache -' license that can be found in the LICENSE file. - -@startuml - -title qsort - -participant go -participant c - -[--> go: qsort -activate go - -go -> go -activate go #DarkSalmon -note left - go_qsort_compare_info.elemsize = sv.Type().Elem().Size() - go_qsort_compare_info.fn = fn -end note - -deactivate go - -go -> c: C.qsort_proxy(cmp=go_qsort_compare) -activate c -note right -void qsort_proxy( - void* base, size_t num, size_t size, - int (*compare)(const void* a, const void* b) -) { - go_qsort_compare_save_base(base); - qsort(base, num, size, compare); -} -end note - -' begin - c -> c: C.go_qsort_compare_save_base - activate c #DarkSalmon - note right: callback go func - - go <- c: go_qsort_compare_save_base - activate go #DarkSalmon - note left - //export go_qsort_compare_save_base - func go_qsort_compare_save_base(base unsafe.Pointer) { - go_qsort_compare_info.base = uintptr(base) - } - var go_qsort_compare_info struct { - base uintptr - elemsize uintptr - fn func(a, b int) int - sync.RWMutex - } - end note - - go -> c: go_qsort_compare_save_base done - deactivate go - - deactivate c -' end - -loop - c -> c: C.go_qsort_compare - activate c #DarkSalmon - note right: callback go func - - c -> go: go_qsort_compare - activate go #DarkSalmon - note left - //export go_qsort_compare_save_base - func go_qsort_compare_save_base(base unsafe.Pointer) { - go_qsort_compare_info.base = uintptr(base) - } - end note - - go -> c: go_qsort_compare done - deactivate go - - deactivate c -end - -go <- c: C.qsort_proxy done -deactivate c - -[<-- go: done -deactivate go - -@enduml diff --git a/images/ch2-qsort-v2.uml.png b/images/ch2-qsort-v2.uml.png deleted file mode 100644 index a197397e4c4ef821665cf2ecca98e48bcb6d4f7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50324 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 z 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 Ljz;?N%lG~lf-(yc diff --git a/images/ch3-02-arch-hsm-zero.jpg b/images/ch3.2-1-arch-hsm-zero.jpg similarity index 100% rename from images/ch3-02-arch-hsm-zero.jpg rename to images/ch3.2-1-arch-hsm-zero.jpg diff --git a/images/ch3-arch-amd64-01.ditaa.png b/images/ch3.2-2-arch-amd64-01.ditaa.png similarity index 100% rename from images/ch3-arch-amd64-01.ditaa.png rename to images/ch3.2-2-arch-amd64-01.ditaa.png diff --git a/images/ch3-arch-amd64-01.ditaa.txt b/images/ch3.2-2-arch-amd64-01.ditaa.txt similarity index 100% rename from images/ch3-arch-amd64-01.ditaa.txt rename to images/ch3.2-2-arch-amd64-01.ditaa.txt diff --git a/images/ch3-arch-amd64-02.ditaa.png b/images/ch3.2-3-arch-amd64-02.ditaa.png similarity index 100% rename from images/ch3-arch-amd64-02.ditaa.png rename to images/ch3.2-3-arch-amd64-02.ditaa.png diff --git a/images/ch3-arch-amd64-02.ditaa.txt b/images/ch3.2-3-arch-amd64-02.ditaa.txt similarity index 100% rename from images/ch3-arch-amd64-02.ditaa.txt rename to images/ch3.2-3-arch-amd64-02.ditaa.txt diff --git a/images/ch3-pkg-var-decl-01.ditaa.png b/images/ch3.3-1-pkg-var-decl-01.ditaa.png similarity index 100% rename from images/ch3-pkg-var-decl-01.ditaa.png rename to images/ch3.3-1-pkg-var-decl-01.ditaa.png diff --git a/images/ch3-pkg-var-decl-01.ditaa.txt b/images/ch3.3-1-pkg-var-decl-01.ditaa.txt similarity index 100% rename from images/ch3-pkg-var-decl-01.ditaa.txt rename to images/ch3.3-1-pkg-var-decl-01.ditaa.txt diff --git a/images/ch3-03-ieee754.jpg b/images/ch3.3-2-ieee754.jpg similarity index 100% rename from images/ch3-03-ieee754.jpg rename to images/ch3.3-2-ieee754.jpg diff --git a/images/ch3-pkg-var-decl-02.ditaa.png b/images/ch3.3-3-pkg-var-decl-02.ditaa.png similarity index 100% rename from images/ch3-pkg-var-decl-02.ditaa.png rename to images/ch3.3-3-pkg-var-decl-02.ditaa.png diff --git a/images/ch3-pkg-var-decl-02.ditaa.txt b/images/ch3.3-3-pkg-var-decl-02.ditaa.txt similarity index 100% rename from images/ch3-pkg-var-decl-02.ditaa.txt rename to images/ch3.3-3-pkg-var-decl-02.ditaa.txt diff --git a/images/ch3-pkg-var-decl-03.ditaa.png b/images/ch3.3-4-pkg-var-decl-03.ditaa.png similarity index 100% rename from images/ch3-pkg-var-decl-03.ditaa.png rename to images/ch3.3-4-pkg-var-decl-03.ditaa.png diff --git a/images/ch3-pkg-var-decl-03.ditaa.txt b/images/ch3.3-4-pkg-var-decl-03.ditaa.txt similarity index 100% rename from images/ch3-pkg-var-decl-03.ditaa.txt rename to images/ch3.3-4-pkg-var-decl-03.ditaa.txt diff --git a/images/ch3-func-decl-01.ditaa.png b/images/ch3.4-1-func-decl-01.ditaa.png similarity index 100% rename from images/ch3-func-decl-01.ditaa.png rename to images/ch3.4-1-func-decl-01.ditaa.png diff --git a/images/ch3-func-decl-01.ditaa.txt b/images/ch3.4-1-func-decl-01.ditaa.txt similarity index 100% rename from images/ch3-func-decl-01.ditaa.txt rename to images/ch3.4-1-func-decl-01.ditaa.txt diff --git a/images/ch3-func-decl-02.ditaa.png b/images/ch3.4-2-func-decl-02.ditaa.png similarity index 100% rename from images/ch3-func-decl-02.ditaa.png rename to images/ch3.4-2-func-decl-02.ditaa.png diff --git a/images/ch3-func-decl-02.ditaa.txt b/images/ch3.4-2-func-decl-02.ditaa.txt similarity index 100% rename from images/ch3-func-decl-02.ditaa.txt rename to images/ch3.4-2-func-decl-02.ditaa.txt diff --git a/images/ch3-func-arg-01.ditaa.png b/images/ch3.4-3-func-arg-01.ditaa.png similarity index 100% rename from images/ch3-func-arg-01.ditaa.png rename to images/ch3.4-3-func-arg-01.ditaa.png diff --git a/images/ch3-func-arg-01.ditaa.txt b/images/ch3.4-3-func-arg-01.ditaa.txt similarity index 100% rename from images/ch3-func-arg-01.ditaa.txt rename to images/ch3.4-3-func-arg-01.ditaa.txt diff --git a/images/ch3-func-local-var-01.ditaa.png b/images/ch3.4-4-func-local-var-01.ditaa.png similarity index 100% rename from images/ch3-func-local-var-01.ditaa.png rename to images/ch3.4-4-func-local-var-01.ditaa.png diff --git a/images/ch3-func-local-var-01.ditaa.txt b/images/ch3.4-4-func-local-var-01.ditaa.txt similarity index 100% rename from images/ch3-func-local-var-01.ditaa.txt rename to images/ch3.4-4-func-local-var-01.ditaa.txt diff --git a/images/ch3-func-call-frame-01.ditaa.png b/images/ch3.4-5-func-call-frame-01.ditaa.png similarity index 100% rename from images/ch3-func-call-frame-01.ditaa.png rename to images/ch3.4-5-func-call-frame-01.ditaa.png diff --git a/images/ch3-func-call-frame-01.ditaa.txt b/images/ch3.4-5-func-call-frame-01.ditaa.txt similarity index 100% rename from images/ch3-func-call-frame-01.ditaa.txt rename to images/ch3.4-5-func-call-frame-01.ditaa.txt diff --git a/images/ch3-func-stack-frame-layout-01.ditaa.png b/images/ch3.6-1-func-stack-frame-layout-01.ditaa.png similarity index 100% rename from images/ch3-func-stack-frame-layout-01.ditaa.png rename to images/ch3.6-1-func-stack-frame-layout-01.ditaa.png diff --git a/images/ch3-func-stack-frame-layout-01.ditaa.txt b/images/ch3.6-1-func-stack-frame-layout-01.ditaa.txt similarity index 100% rename from images/ch3-func-stack-frame-layout-01.ditaa.txt rename to images/ch3.6-1-func-stack-frame-layout-01.ditaa.txt