Debugging 汇编语言中调试信息的解释 0x00473a28:推送%ebp 0x00473a29:mov%esp,%ebp 0x00473a2b:子$0x8,%esp 0x00473a2e:呼叫0x419150 0x00473a33:mov%ecx,-0x4(%ebp) 0x00473a36:mov 0x8(%ebp),%eax =>0x00473a39:mov(%eax),%edx 0x00473a3b:mov-0x4(%ebp),%eax 0x00473a3e:mov%edx,(%eax) 0x00473A4:mov 0xc(%ebp),%eax 0x00473a43:mov%eax,(%esp) 0x00473a46:调用0x4837c8 0x00473A4:mov(%eax),%edx 0x00473a4d:mov-0x4(%ebp),%eax 0x00473a50:mov%edx,0x4(%eax) 0x00473a53:离开 0x00473a54:ret$0x8

Debugging 汇编语言中调试信息的解释 0x00473a28:推送%ebp 0x00473a29:mov%esp,%ebp 0x00473a2b:子$0x8,%esp 0x00473a2e:呼叫0x419150 0x00473a33:mov%ecx,-0x4(%ebp) 0x00473a36:mov 0x8(%ebp),%eax =>0x00473a39:mov(%eax),%edx 0x00473a3b:mov-0x4(%ebp),%eax 0x00473a3e:mov%edx,(%eax) 0x00473A4:mov 0xc(%ebp),%eax 0x00473a43:mov%eax,(%esp) 0x00473a46:调用0x4837c8 0x00473A4:mov(%eax),%edx 0x00473a4d:mov-0x4(%ebp),%eax 0x00473a50:mov%edx,0x4(%eax) 0x00473a53:离开 0x00473a54:ret$0x8,debugging,assembly,Debugging,Assembly,我对汇编语言不太熟悉,这条尖线表示什么样的问题?我将从您所指的那一行之前的那一行开始 0x00473a28 <+0>: push %ebp 0x00473a29 <+1>: mov %esp,%ebp 0x00473a2b <+3>: sub $0x8,%esp 0x00473a2e <+6>: call 0x419150 <mcount> 0x00473a33 <+11>:

我对汇编语言不太熟悉,这条尖线表示什么样的问题?

我将从您所指的那一行之前的那一行开始

   0x00473a28 <+0>: push   %ebp
   0x00473a29 <+1>: mov    %esp,%ebp
   0x00473a2b <+3>: sub    $0x8,%esp
   0x00473a2e <+6>: call   0x419150 <mcount>
   0x00473a33 <+11>:    mov    %ecx,-0x4(%ebp)
   0x00473a36 <+14>:    mov    0x8(%ebp),%eax
=> 0x00473a39 <+17>:    mov    (%eax),%edx
   0x00473a3b <+19>:    mov    -0x4(%ebp),%eax
   0x00473a3e <+22>:    mov    %edx,(%eax)
   0x00473a40 <+24>:    mov    0xc(%ebp),%eax
   0x00473a43 <+27>:    mov    %eax,(%esp)
   0x00473a46 <+30>:    call   0x4837c8 <std::forward<hash_tree_node*&>(std::remove_reference<hash_tree_node*&>::type&)>
   0x00473a4b <+35>:    mov    (%eax),%edx
   0x00473a4d <+37>:    mov    -0x4(%ebp),%eax
   0x00473a50 <+40>:    mov    %edx,0x4(%eax)
   0x00473a53 <+43>:    leave  
   0x00473a54 <+44>:    ret    $0x8
此指令现在假定
%eax
中的值是存在于应用程序允许的地址空间中的有效地址。它获取该地址的32位值,并将该值放入
%edx

可能出现的问题是,如果作为此函数的第一个参数传递无效地址(不在应用程序允许的地址空间内的地址)。例如,如果发生这种情况,您可能会遇到分段错误,或者可能只是未定义的行为

如果您想进一步检查它,可以在此时查看
%eax
的值,看看它是否是一个合理的地址。或者转到调用此函数的源代码,检查作为该函数的第一个参数传递的内容,并确定它是否是指向应用程序数据或已正确分配的堆数据的有效指针

   0x00473a36 <+14>:    mov    0x8(%ebp),%eax
=> 0x00473a39 <+17>:    mov    (%eax),%edx