x64中jmp rax语句跳转到哪里?
最近在想看C#尾递归优化的汇编指令,在vs2015的debug -> disassembly中查看汇编指令。有一段这样的指令:
00007FF97D134960 mov rax,7FF97D130F58h
00007FF97D13496A jmp rax
但是我发现在 jmp rax指令后没有定位到7FF97D130F58h这个位置。
本人的汇编知识仅限于上学时候学的内容。对于x64并不熟悉,网上查了一会也无果。所以我想请教一下各位这个jmp rax为什么没有跳转到rax内容这个位置。
下面是详细的信息:
C#源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class Solution
{
public int foo2(int k, int n)
{
if (k == 0) return n;
k = k - 1;
return foo2(k-1, n+2);
}
static void Main(string[] args)
{
Solution x = new Solution();
int res = x.foo2(1000,0);
Console.WriteLine(res);
}
}
开发环境为vs2015 community,.Net版本为4.5.2,x64 release模式编译。在release模式中debug并开启JIT,需要将Options -> Debugging -> General 中的Enable Just My Code和 Suppress JIT optimization on module load的对号去掉。
从call stack中可以看出来已经进行了JIT已经尾递归优化。
得到的foo2函数的汇编码如下,在debug执行中汇编码会发生变化:
1.
if (k == 0) return n;
00007FF97D1644B0 test edx,edx
00007FF97D1644B2 jne 00007FF97D1644B8
00007FF97D1644B4 mov eax,r8d
00007FF97D1644B7 ret
k = k - 1;
00007FF97D1644B8 dec edx
return foo2(k-1, n+2);
00007FF97D1644BA add r8d,2
00007FF97D1644BE dec edx
00007FF97D1644C0 mov rax,7FF97D160F58h
00007FF97D1644CA jmp rax
2.
if (k == 0) return n;
00007FF97D1644B5 mov eax,eax
00007FF97D1644B7 ret
k = k - 1;
00007FF97D1644B8 dec edx
return foo2(k-1, n+2);
00007FF97D1644BA add r8d,2
00007FF97D1644BE dec edx
00007FF97D1644C0 mov rax,7FF97D160F58h
00007FF97D1644CA jmp rax
事实上,在每次执行jmp 之后都是调到了1.中的test edx,edx 这行去了。
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论