From 047c5a6185e92184aa14f41d969c3d50c69dde06 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Sat, 23 Jun 2018 08:18:29 +0800 Subject: [PATCH] =?UTF-8?q?ch3-02:=20=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch3-asm/ch3-02-arch.md | 14 ++++ .../ch3-func-stack-frame-layout-01.ditaa.png | Bin 0 -> 35130 bytes .../ch3-func-stack-frame-layout-01.ditaa.txt | 63 ++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 images/ch3-func-stack-frame-layout-01.ditaa.png create mode 100644 images/ch3-func-stack-frame-layout-01.ditaa.txt diff --git a/ch3-asm/ch3-02-arch.md b/ch3-asm/ch3-02-arch.md index 74fadf1..5bc59f6 100644 --- a/ch3-asm/ch3-02-arch.md +++ b/ch3-asm/ch3-02-arch.md @@ -140,3 +140,17 @@ Go汇编为了简化汇编代码的编写,引入了PC、FP、SP、SB四个伪 当需要区分伪寄存器和真寄存器的时候只需要记住一点:伪寄存器一般需要一个标识符和偏移量为前缀,如果没有标识符前缀则是真寄存器。比如`(SP)`、`+8(SP)`没有标识符前缀为真SP寄存器,而`a(SP)`、`b+8(SP)`有标识符为前缀表示伪寄存器。 + +## Go函数调用规范 + +和C语言函数不同,Go语言函数的参数和返回值完全通过栈传递。下面是Go函数调用时栈的布局图: + +![](../images/ch3-func-stack-frame-layout-01.ditaa.png) + +在汇编定义函数时,我们需要关注framesize和argsize,分别对应函数帧大学和函数参数和返回值的大小。 + +因为函数的参数和返回大学可以通过Go函数的签名解析得到,因此argsize一般是可以省略的。需要注意的是,输入参数和返回值依此从低地址向高地址顺序排列。同时每个参数的类型需要满足地址对齐要求。 + +帧大小相对复杂一点:其中包含函数的局部变量和调用其它函数时的参数和返回值空间。局部变量也是从低地址向高地址顺序排列的,因此它们栈增长方向是相反的。 + +在最下面灰色的部分是调用函数后的返回地址。当执行CALL指令时,会自动将SP向下移动,并将返回地址和SP寄存器存入栈中。然后被调用的函数执行RET返回指令时,先从栈恢复BP和SP寄存器,并根取出的返回地址跳转到对应的指令执行。 diff --git a/images/ch3-func-stack-frame-layout-01.ditaa.png b/images/ch3-func-stack-frame-layout-01.ditaa.png new file mode 100644 index 0000000000000000000000000000000000000000..bf090d8047376aaa95682f3d6fd8f0cad1b8b7b0 GIT binary patch literal 35130 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
    C}YDtoAQo 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 literal 0 HcmV?d00001 diff --git a/images/ch3-func-stack-frame-layout-01.ditaa.txt b/images/ch3-func-stack-frame-layout-01.ditaa.txt new file mode 100644 index 0000000..0fb7a9b --- /dev/null +++ b/images/ch3-func-stack-frame-layout-01.ditaa.txt @@ -0,0 +1,63 @@ + Stack frame layout X86/AMD64 + + ---=- +-=-------------------------+ + ^ | | + | | ret1 to caller | + | | | + | +-=-------------------------+<--ret1+24(FP) + | | | + : | ret0 to caller | + | | + argsize +-=-------------------------+<--ret0+16(FP) + | | + : | arg1 from caller | + | | | + | +-=-------------------------+<--arg1+8(FP) + | | | + | | arg0 from caller | + v | | + ---=- +-=-------------------------+<--arg0+0(FP) + | | + | parent return address | + | | + +---------------------------+ + | c9D5 | + | caller's BP | + | (if framepointer_enabled) | + ---=- +---------------------------+<--BP(pseudo SP) + ^ | cD0A | + | | local varable2 | + | | | + | +---------------------------+<--var2-8(SP) + | | cD0A | + | | local varable1 | + | | | + | +---------------------------+<--var1-16(SP) + | | cD0A | + | | local varable0 | + | | | + | +---------------------------+<--var0-24(SP) + : | cYEL | + | | ret1 from callee | + | | + framesize+---------------------------+<--24(SP) + | cYEL | + | | ret0 from callee | + : | | + | +---------------------------+<--16(SP) + | | cF51 | + | | arg1 to callee | + | | | + | +---------------------------+<--8(SP) + | | cF51 | + | | arg0 to callee | + v | | + ---=- +---------------------------+<--0(SP) + | cAAA | + | return address | + | | + +---------------------------+ + | cAAA | + | caller's BP | + | (if framepointer_enabled) | + +---------------------------+