微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在间接跳转开始执行之前更新寄存器

如何解决为什么在间接跳转开始执行之前更新寄存器

我使用gdb探索间接跳转,但是当我在 jump *%rax 指令中设置断点时, %rax寄存器似乎已经由它定向的内存内容进行了更新。

我期望rax在执行跳转之前和之后都不会更新。

(gdb) disassemble 
Dump of assembler code for function square_elements(double const*,double*,int):
   0x0000000000401172 <+0>: push   %rbp
   0x0000000000401173 <+1>: mov    %rsp,%rbp
   0x0000000000401176 <+4>: sub    $0x20,%rsp
   0x000000000040117a <+8>: mov    %rdi,-0x8(%rbp)
   0x000000000040117e <+12>:    mov    %rsi,-0x10(%rbp)
   0x0000000000401182 <+16>:    mov    %edx,-0x14(%rbp)
   0x0000000000401185 <+19>:    cmpl   $0x6,-0x14(%rbp)
   0x0000000000401189 <+23>:    ja     0x401201 <square_elements(double const*,int)+143>
   0x000000000040118b <+25>:    mov    -0x14(%rbp),%eax
=> 0x000000000040118e <+28>:    mov    0x402028(,%rax,8),%rax
   0x0000000000401196 <+36>:    jmpq   *%rax
   0x0000000000401198 <+38>:    mov    $0x402011,%esi
   0x000000000040119d <+43>:    mov    $0x404060,%edi
   0x00000000004011a2 <+48>:    callq  0x401040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x00000000004011a7 <+53>:    jmp    0x401201 <square_elements(double const*,int)+143>
   0x00000000004011a9 <+55>:    mov    $0x402014,%esi
   0x00000000004011ae <+60>:    mov    $0x404060,%edi
   0x00000000004011b3 <+65>:    callq  0x401040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x00000000004011b8 <+70>:    jmp    0x401201 <square_elements(double const*,int)+143>
   0x00000000004011ba <+72>:    addl   $0x3,-0x14(%rbp)
   0x00000000004011be <+76>:    mov    $0x402016,%esi
   0x00000000004011c3 <+81>:    mov    $0x404060,%edi
   0x00000000004011c8 <+86>:    callq  0x401040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x00000000004011cd <+91>:    jmp    0x401201 <square_elements(double const*,int)+143>
   0x00000000004011cf <+93>:    mov    $0x40201a,%esi
   0x00000000004011d4 <+98>:    mov    $0x404060,%edi
   0x00000000004011d9 <+103>:   callq  0x401040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x00000000004011de <+108>:   jmp    0x401201 <square_elements(double const*,int)+143>
   0x00000000004011e0 <+110>:   mov    $0x40201d,%esi
   0x00000000004011e5 <+115>:   mov    $0x404060,%edi
   0x00000000004011ea <+120>:   callq  0x401040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
---Type <return> to continue,or q <return> to quit---q
Quit
(gdb) info breakpoints 
Num     Type           disp Enb Address            What
1       breakpoint     keep y   0x000000000040118e in square_elements(double const*,int) at x.cc:3
    breakpoint already hit 1 time
2       breakpoint     keep y   0x0000000000401196 in square_elements(double const*,int) at x.cc:3
(gdb) info register rax
rax            0x3  3
(gdb) c
Continuing.

Breakpoint 2,0x0000000000401196 in square_elements (x=0x7fffffffde78,y=0x7fffffffde70,n=3) at x.cc:3
3   int square_elements(const double* x,double* y,int n) {
(gdb) info register rax
rax            0x4011ba 4198842
(gdb) 

在上述gdb会话中。

在地址0x000000000040118e中,设置rax,其值应为0x402028 + rax * 8

下一条指令是跳转,此处设置的断点显示rax为0x4011ba,

这是地址0x402028 + rax * 8处的内存内容

cpu似乎已经在该地址读取了内存内容,并将其更新为rax

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。