What does assembly code of function "do_compare" exactly do?

0

The do_compare function is in the libstdc++ library. It basically checks two strings and returns -1, 1, or 0 accordingly. Here is the C++ code:

template<typename _CharT>
    int
    collate<_CharT>::
    do_compare(const _CharT* __lo1, const _CharT* __hi1,
               const _CharT* __lo2, const _CharT* __hi2) const
    {
      // strcoll assumes zero-terminated strings so we make a copy
      // and then put a zero at the end.
      const string_type __one(__lo1, __hi1);
      const string_type __two(__lo2, __hi2);
      const _CharT* __p = __one.c_str();
      const _CharT* __pend = __one.data() + __one.length();
      const _CharT* __q = __two.c_str();
      const _CharT* __qend = __two.data() + __two.length();
      // strcoll stops when it sees a nul character so we break
      // the strings into zero-terminated substrings and pass those
      // to strcoll.
      for (;;)
        {
          const int __res = _M_compare(__p, __q);
          if (__res)
            return __res;
          __p += char_traits<_CharT>::length(__p);
          __q += char_traits<_CharT>::length(__q);
          if (__p == __pend && __q == __qend)
            return 0;
          else if (__p == __pend)
            return -1;
          else if (__q == __qend)
            return 1;
          __p++;
          __q++;
        }
    }

I have to put the entire assembly code of do_compare to show my problem, sorry:

0000000000101c40 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4>:
  101c40:   41 57                   push   %r15
  101c42:   41 56                   push   %r14
  101c44:   49 89 fe                mov    %rdi,%r14
  101c47:   48 89 f7                mov    %rsi,%rdi
  101c4a:   48 89 d6                mov    %rdx,%rsi
  101c4d:   41 55                   push   %r13
  101c4f:   41 54                   push   %r12
  101c51:   55                      push   %rbp
  101c52:   4c 89 c5                mov    %r8,%rbp
  101c55:   53                      push   %rbx
  101c56:   48 89 cb                mov    %rcx,%rbx
  101c59:   48 83 ec 38             sub    $0x38,%rsp
  101c5d:   64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
  101c64:   00 00 
  101c66:   48 89 44 24 28          mov    %rax,0x28(%rsp)
  101c6b:   31 c0                   xor    %eax,%eax
  101c6d:   4c 8d 6c 24 27          lea    0x27(%rsp),%r13
  101c72:   4c 89 ea                mov    %r13,%rdx
  101c75:   4c 89 6c 24 18          mov    %r13,0x18(%rsp)
  101c7a:   e8 f1 a2 f8 ff          callq  8bf70 <_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag@plt>
  101c7f:   4c 89 ea                mov    %r13,%rdx
  101c82:   48 89 ee                mov    %rbp,%rsi
  101c85:   48 89 df                mov    %rbx,%rdi
  101c88:   49 89 c7                mov    %rax,%r15
  101c8b:   48 89 44 24 08          mov    %rax,0x8(%rsp)
  101c90:   e8 db a2 f8 ff          callq  8bf70 <_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag@plt>
  101c95:   4d 8b 67 e8             mov    -0x18(%r15),%r12
  101c99:   4c 8b 68 e8             mov    -0x18(%rax),%r13
  101c9d:   48 89 c5                mov    %rax,%rbp
  101ca0:   48 89 44 24 10          mov    %rax,0x10(%rsp)
  101ca5:   4c 89 fb                mov    %r15,%rbx
  101ca8:   4d 01 fc                add    %r15,%r12
  101cab:   49 01 c5                add    %rax,%r13
  101cae:   eb 32                   jmp    101ce2 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0xa2>
  101cb0:   48 89 df                mov    %rbx,%rdi
  101cb3:   e8 98 87 f8 ff          callq  8a450 <strlen@plt>
  101cb8:   48 89 ef                mov    %rbp,%rdi
  101cbb:   48 01 c3                add    %rax,%rbx
  101cbe:   e8 8d 87 f8 ff          callq  8a450 <strlen@plt>
  101cc3:   48 01 c5                add    %rax,%rbp
  101cc6:   49 39 dc                cmp    %rbx,%r12
  101cc9:   75 05                   jne    101cd0 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x90>
  101ccb:   49 39 ed                cmp    %rbp,%r13
  101cce:   74 27                   je     101cf7 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0xb7>
  101cd0:   49 39 dc                cmp    %rbx,%r12
  101cd3:   74 6b                   je     101d40 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x100>
  101cd5:   49 39 ed                cmp    %rbp,%r13
  101cd8:   74 76                   je     101d50 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x110>
  101cda:   48 83 c3 01             add    $0x1,%rbx
  101cde:   48 83 c5 01             add    $0x1,%rbp
  101ce2:   48 89 ea                mov    %rbp,%rdx
  101ce5:   48 89 de                mov    %rbx,%rsi
  101ce8:   4c 89 f7                mov    %r14,%rdi
  101ceb:   e8 20 8b f8 ff          callq  8a810 <_ZNKSt7collateIcE10_M_compareEPKcS2_@plt>
  101cf0:   41 89 c7                mov    %eax,%r15d
  101cf3:   85 c0                   test   %eax,%eax
  101cf5:   74 b9                   je     101cb0 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x70>
  101cf7:   48 8b 7c 24 10          mov    0x10(%rsp),%rdi
  101cfc:   48 8b 1d 9d 08 28 00    mov    0x28089d(%rip),%rbx        # 3825a0 <_ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4-0x57e0>
  101d03:   48 83 ef 18             sub    $0x18,%rdi
  101d07:   48 39 df                cmp    %rbx,%rdi
  101d0a:   75 54                   jne    101d60 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x120>
  101d0c:   48 8b 7c 24 08          mov    0x8(%rsp),%rdi
  101d11:   48 83 ef 18             sub    $0x18,%rdi
  101d15:   48 39 df                cmp    %rbx,%rdi
  101d18:   75 56                   jne    101d70 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x130>
  101d1a:   48 8b 4c 24 28          mov    0x28(%rsp),%rcx
  101d1f:   64 48 33 0c 25 28 00    xor    %fs:0x28,%rcx
  101d26:   00 00 
  101d28:   44 89 f8                mov    %r15d,%eax
  101d2b:   75 4f                   jne    101d7c <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x13c>
  101d2d:   48 83 c4 38             add    $0x38,%rsp
  101d31:   5b                      pop    %rbx
  101d32:   5d                      pop    %rbp
  101d33:   41 5c                   pop    %r12
  101d35:   41 5d                   pop    %r13
  101d37:   41 5e                   pop    %r14
  101d39:   41 5f                   pop    %r15
  101d3b:   c3                      retq   
  101d3c:   0f 1f 40 00             nopl   0x0(%rax)
  101d40:   41 bf ff ff ff ff       mov    $0xffffffff,%r15d
  101d46:   eb af                   jmp    101cf7 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0xb7>
  101d48:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
  101d4f:   00 
  101d50:   41 bf 01 00 00 00       mov    $0x1,%r15d
  101d56:   eb 9f                   jmp    101cf7 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0xb7>
  101d58:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
  101d5f:   00 
  101d60:   48 8b 74 24 18          mov    0x18(%rsp),%rsi
  101d65:   e8 96 fe ff ff          callq  101c00 <_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4+0x20>
  101d6a:   eb a0                   jmp    101d0c <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0xcc>
  101d6c:   0f 1f 40 00             nopl   0x0(%rax)
  101d70:   48 8b 74 24 18          mov    0x18(%rsp),%rsi
  101d75:   e8 86 fe ff ff          callq  101c00 <_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4+0x20>
  101d7a:   eb 9e                   jmp    101d1a <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0xda>
  101d7c:   e8 7f 95 f8 ff          callq  8b300 <__stack_chk_fail@plt>
  101d81:   48 89 c3                mov    %rax,%rbx
  101d84:   48 8b 7c 24 08          mov    0x8(%rsp),%rdi
  101d89:   48 83 ef 18             sub    $0x18,%rdi
  101d8d:   48 3b 3d 0c 08 28 00    cmp    0x28080c(%rip),%rdi        # 3825a0 <_ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4-0x57e0>
  101d94:   74 0a                   je     101da0 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x160>
  101d96:   48 8b 74 24 18          mov    0x18(%rsp),%rsi
  101d9b:   e8 60 fe ff ff          callq  101c00 <_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4+0x20>
  101da0:   48 89 df                mov    %rbx,%rdi
  101da3:   e8 e8 a1 f8 ff          callq  8bf90 <_Unwind_Resume@plt>
  101da8:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
  101daf:   00 
  *******101db0:    53                      push   %rbx
  101db1:   48 89 fb                mov    %rdi,%rbx
  101db4:   48 8b 3f                mov    (%rdi),%rdi
  101db7:   89 f0                   mov    %esi,%eax
  101db9:   48 85 ff                test   %rdi,%rdi
  101dbc:   74 05                   je     101dc3 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x183>
  101dbe:   83 fe ff                cmp    $0xffffffff,%esi
  101dc1:   74 05                   je     101dc8 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x188>
  101dc3:   5b                      pop    %rbx
  101dc4:   c3                      retq   
  101dc5:   0f 1f 00                nopl   (%rax)
  101dc8:   48 8b 47 10             mov    0x10(%rdi),%rax
  101dcc:   48 3b 47 18             cmp    0x18(%rdi),%rax
  101dd0:   73 0e                   jae    101de0 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x1a0>
  101dd2:   0f b6 00                movzbl (%rax),%eax
  101dd5:   5b                      pop    %rbx
  101dd6:   c3                      retq   
  101dd7:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  101dde:   00 00 
  101de0:   48 8b 07                mov    (%rdi),%rax
  101de3:   ff 50 48                callq  *0x48(%rax)
  101de6:   83 f8 ff                cmp    $0xffffffff,%eax
  101de9:   75 d8                   jne    101dc3 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x183>
  101deb:   48 c7 03 00 00 00 00    movq   $0x0,(%rbx)
  101df2:   5b                      pop    %rbx
  101df3:   c3                      retq   
  101df4:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  101dfb:   00 00 00 
  101dfe:   66 90                   xchg   %ax,%ax
  101e00:   55                      push   %rbp
  101e01:   89 f5                   mov    %esi,%ebp
  101e03:   53                      push   %rbx
  101e04:   48 89 fb                mov    %rdi,%rbx
  101e07:   48 83 ec 08             sub    $0x8,%rsp
  101e0b:   e8 b0 88 f8 ff          callq  8a6c0 <_ZNKSt5ctypeIcE13_M_widen_initEv@plt>
  101e10:   48 8b 03                mov    (%rbx),%rax
  101e13:   48 8b 40 30             mov    0x30(%rax),%rax
  101e17:   48 3b 05 7a 11 28 00    cmp    0x28117a(%rip),%rax        # 382f98 <_ZNKSt5ctypeIcE8do_widenEc@@GLIBCXX_3.4+0x2e2c48>
  101e1e:   75 10                   jne    101e30 <_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4+0x1f0>
  101e20:   48 83 c4 08             add    $0x8,%rsp
  101e24:   89 e8                   mov    %ebp,%eax
  101e26:   5b                      pop    %rbx
  101e27:   5d                      pop    %rbp
  101e28:   c3                      retq   
  101e29:   0f 1f 80 00 00 00 00    nopl   0x0(%rax)
  101e30:   48 83 c4 08             add    $0x8,%rsp
  101e34:   40 0f be f5             movsbl %bpl,%esi
  101e38:   48 89 df                mov    %rbx,%rdi
  101e3b:   5b                      pop    %rbx
  101e3c:   5d                      pop    %rbp
  101e3d:   ff e0                   jmpq   *%rax
  101e3f:   90                      nop

It seems to me that the assembly code not only performs the C++ code logic but also adds other logic.

As an example, the function _M_extract_int in libstdc++ which coverts a char to int calls this function as the following:

callq 0x101db0

The instruction address 0x101db0 is in the middle of the assembly code. The code section from 0x101db0 to 0x101dbc seems to have nothing to do with the above C++ code. Really confused about what is going on here...

c++
assembly
x86
g++
asked on Stack Overflow Oct 27, 2020 by syacer • edited Oct 28, 2020 by 1201ProgramAlarm

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0