首页 > x64中jmp rax语句跳转到哪里?

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 这行去了。

谢谢。

【热门文章】
【热门文章】