使用MSVS2010程序集设置java对象数组元素

使用MSVS2010程序集设置java对象数组元素,java,visual-c++,assembly,nasm,jvm-hotspot,Java,Visual C++,Assembly,Nasm,Jvm Hotspot,我正在尝试向Java本机方法添加一个新过程。为此,我下载了OpenJDK 7源代码来构建一个新的JVM,其中包含我在Windows XP中的过程(32位) 我的问题是如何计算堆中数组对象Java元素的地址 假设我创建了一个包含5个元素的数组T,每个元素由2个整数元素(intx,inty)[8字节(x为4字节,y为4字节)]组成 要获取T[0],我们需要获取T[0]中包含的地址,并从内存中加载它的内容 我在Microsoft VS2010中实现了此方法,效果非常好: Elmt:是2整数的对象Elm

我正在尝试向Java本机方法添加一个新过程。为此,我下载了OpenJDK 7源代码来构建一个新的JVM,其中包含我在Windows XP中的过程(32位)

我的问题是如何计算堆中数组对象Java元素的地址

假设我创建了一个包含5个元素的数组
T
,每个元素由2个整数元素(intx,inty)[8字节(x为4字节,y为4字节)]组成

要获取
T[0]
,我们需要获取
T[0]
中包含的地址,并从内存中加载它的内容

我在Microsoft VS2010中实现了此方法,效果非常好:

Elmt
:是2整数的对象
Elmt(int x,int y)

程序更新如下更改元素:
x=7
例如:
T[0]=(1,1)
更新后将是
T[0]=(7,1)

现在,当我将此方法添加到OpenJDK 7时,JVM中元素的地址出现了问题。 我无法根据数组
T
中的地址计算元素的正确地址

OpenJDK中的代码如下所示,OOP是JVM使用的普通对象

static void test(oop* from, oop * to, size_t count) {

    from += count - 1;
    to   += count - 1;
    while (count-- > 0) {
             update(from);
                     *to-- = *from--;
                        }
                 }           


static void update (oop * p){
        __asm{
             mov         ecx, p 
                 mov         [ecx], 7
                 }

                 }
我的问题是:如何在汇编中计算JVM中数组
T
元素的正确地址

C++中的P>工作得很好,但是在java中呢?我知道C++中对象的寻址内存模式与java不同:

注意:我没有使用
CompressedOops

不确定,但您是否考虑了可能与数据结构相关的其他数据?您似乎假设数据正是根据成员大小计算的,但这种假设可能是错误的。不知道Java接口,但是你确定相关数据从结构的开头开始吗?你是对的,Java向对象添加了额外的数据,例如对象的头需要8个字节。我尝试了**mov[ecx+8],7**来避免头字节,但它不起作用!!为什么你认为它应该是ecx+8而不是其他东西?我不确定,我只是试图避免头的8个字节(ecx+8)来获取元素的内容。我会认为你的回答类似于
,我查看了源代码,从中我认为应该是
。显然,您必须查看SDK,了解结构在编译时的样子,然后才能知道特定实现的正确偏移量。
static void test(oop* from, oop * to, size_t count) {

    from += count - 1;
    to   += count - 1;
    while (count-- > 0) {
             update(from);
                     *to-- = *from--;
                        }
                 }           


static void update (oop * p){
        __asm{
             mov         ecx, p 
                 mov         [ecx], 7
                 }

                 }