如何解决为什么在间接跳转开始执行之前更新寄存器
我使用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处的内存内容;
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。