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?
2.1 rip 0x47ae4d, 0x47ae4d + 132763 = 0x49b4e8,
2.2 main.add.func1's address is 0x47b0c0
objdump -D -S main | grep "main.add.func1>:" -A 31
000000000047aee0 <main.add.func1>:
2.3 i just found 0x49b4e8 in rodata
2.4 So, What is stored at 0x49b4e8?

在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+unsubscr...@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.

Reply via email to