Thanks for the guidance, the corresponding documentation helped me a lot

在2023年9月28日星期四 UTC+8 11:34:21<Ian Lance Taylor> 写道:

> On Tue, Sep 26, 2023 at 11:06 PM j2gg0s <feys...@gmail.com> wrote:
> >
> > Related go code:
> > 22 //go:noinline
> > 23 func add(a, b int) int {
> > 24 defer func() {
> > 25 fmt.Println(3)
> > 26 }()
> > 27 return a + b
> > 28 }
> >
> > Build by: GOOS=linux GOARCH=amd64 go21 build main.go
> >
> > Disassembler by: objdump -D -S main
> > Assembly code:
> > 179228 000000000047ae20 <main.add>:
> > 179229 ; func add(a, b int) int {
> > 179230 47ae20: 49 3b 66 10 cmpq 16(%r14), %rsp
> > 179231 47ae24: 76 5b jbe 0x47ae81 <main.add+0x61>
> > 179232 47ae26: 55 pushq %rbp
> > 179233 47ae27: 48 89 e5 movq %rsp, %rbp
> > 179234 47ae2a: 48 83 ec 18 subq $24, %rsp
> > 179235 47ae2e: 66 44 0f d6 7c 24 10 movq %xmm15, 16(%rsp)
> > 179236 47ae35: c6 44 24 07 00 movb $0, 7(%rsp)
> > 179237 47ae3a: 48 c7 44 24 08 00 00 00 00 movq $0, 8(%rsp)
> > 179238 ; return a + b
> > 179239 47ae43: 48 01 d8 addq %rbx, %rax
> > 179240 ; defer func() {
> > 179241 47ae46: 48 8d 0d 9b 06 02 00 leaq 132763(%rip), %rcx # 0x49b4e8 
> <go:func.*+0x220>
> > 179242 47ae4d: 48 89 4c 24 10 movq %rcx, 16(%rsp)
> > 179243 47ae52: c6 44 24 07 01 movb $1, 7(%rsp)
> > 179244 ; return a + b
> > 179245 47ae57: 48 89 44 24 08 movq %rax, 8(%rsp)
> > 179246 47ae5c: c6 44 24 07 00 movb $0, 7(%rsp)
> > 179247 47ae61: e8 7a 00 00 00 callq 0x47aee0 <main.add.func1>
> > 179248 47ae66: 48 8b 44 24 08 movq 8(%rsp), %rax
> > 179249 47ae6b: 48 83 c4 18 addq $24, %rsp
> > 179250 47ae6f: 5d popq %rbp
> > 179251 47ae70: c3 retq
> >
> >
> > According to my understanding:
> > 1. `179241 47ae46: 48 8d 0d 9b 06 02 00 leaq 132763(%rip), %rcx # 
> 0x49b4e8 <go:func.*+0x220>` want to load address of main.add.func1 to 
> register rcx. Is this understanding correct?
>
> Sort of. 0x49b4e8 is the address of the function descriptor for
> main.add.func1. If you look at address 0x49b4e8 you will see that it
> contains the value 0x47aee0, which is the address of the code for
> main.add.func1. For function descriptors see
> https://go.dev/s/go11func.
>
> > 2.1 rip 0x47ae4d, 0x47ae4d + 132763 = 0x49b4e8,
>
> Yes, as the disassembler comment says.
>
> > 2.2 main.add.func1's address is 0x47b0c0
> > objdump -D -S main | grep "main.add.func1>:" -A 31
> > 000000000047aee0 <main.add.func1>:
>
> Well, 0x47aee0, not 0x47b0c0
>
> > 2.3 i just found 0x49b4e8 in rodata
> > 2.4 So, What is stored at 0x49b4e8?
>
> The code for main.add.func1.
>
> Ian
>
>
> > 在2023年9月27日星期三 UTC+8 12:44:10<Ian Lance Taylor> 写道:
> >>
> >> On Tue, Sep 26, 2023 at 9:10 PM j2gg0s <feys...@gmail.com> wrote:
> >> >
> >> > Already read it, I actually started here.
> >> >
> >> > What I can't understand is x64 rip-relative address.
> >> >
> >> > leaq 132795(%rip), %rcx # 0x49b4e8 <go:func.*+0x220>
> >> >
> >> > why 132795, and what is loaded into rcx
> >>
> >> It's a reference to another address in the program. The comment from
> >> the disassembler tells you that it refers to the address go:func.* +
> >> 0x220. The linker constructs the offset 132795.
> >>
> >> Ian
> >>
> >>
> >>
> >> > 在2023年9月27日星期三 UTC+8 09:38:17<Ian Lance Taylor> 写道:
> >> >>
> >> >> On Tue, Sep 26, 2023 at 7:43 AM j2gg0s <feys...@gmail.com> wrote:
> >> >> >
> >> >> > How to understand assmbly code ` 47ae26: 48 8d 0d bb 06 02 00 leaq 
> 132795(%rip), %rcx # 0x49b4e8 <go:func.*+0x220>`
> >> >>
> >> >> The best place to start is
> >> >>
> >> >> 
> https://go.googlesource.com/proposal/+/refs/heads/master/design/34481-opencoded-defers.md
> >> >>
> >> >> Ian
> >> >
> >> > --
> >> > You received this message because you are subscribed to the Google 
> Groups "golang-nuts" group.
> >> > To unsubscribe from this group and stop receiving emails from it, 
> send an email to golang-nuts...@googlegroups.com.
> >> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/69d8ca43-d4e7-4945-ab94-9951fa51188dn%40googlegroups.com
> .
> >
> > --
> > You received this message because you are subscribed to the Google 
> Groups "golang-nuts" group.
> > To unsubscribe from this group and stop receiving emails from it, send 
> an email to golang-nuts...@googlegroups.com.
> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/3981c7b9-804b-4dd6-959c-9da0656bb317n%40googlegroups.com
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/be40ad47-0c86-4f34-9933-3e48d3cf405cn%40googlegroups.com.

Reply via email to