使用MSVS2010程序集设置java对象数组元素
我正在尝试向Java本机方法添加一个新过程。为此,我下载了OpenJDK 7源代码来构建一个新的JVM,其中包含我在Windows XP中的过程(32位) 我的问题是如何计算堆中数组对象Java元素的地址 假设我创建了一个包含5个元素的数组使用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
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
}
}