Java内联程序集传输变量
您好,我正在尝试使用内联汇编编写简单的java代码。在asm过程中,我想对java变量执行一些操作,下面是我的代码Java内联程序集传输变量,java,assembly,inline,Java,Assembly,Inline,您好,我正在尝试使用内联汇编编写简单的java代码。在asm过程中,我想对java变量执行一些操作,下面是我的代码 public class Add { public static void main(String[] args) { int a=5; int b=4; int c=0; System.loadLibrary("native"); (new Add()).nati
public class Add {
public static void main(String[] args) {
int a=5;
int b=4;
int c=0;
System.loadLibrary("native");
(new Add()).nativeCode();
}
public native void nativeCode();
}
和Asm程序
global _Java_Add_nativeCode
section .text
_Java_Add_nativeCode:
mov eax, a
mov ebx, b
add eax,ebx
mov c,eax
<>我尝试对C++中的变量做操作,但是Nasm给了我一个错误符号‘a’un定义等。在ASM过程中有什么方法可以对java中声明的变量进行操作吗?
a
是一个虚拟变量。目前唯一的方法是通过JNI在C中实现方法调用。我建议您使用javah来生成C代码,并从中使用asm
。注意:这比在Java中做同样的事情要慢很多倍(而且要复杂很多倍)
在Java9中,您可能能够使用用户定义的内部函数。这将允许您将程序集添加到Java中,以使用Java目前不像XMM那样使用的指令。局部变量只能在定义变量的块的范围内访问。超出该范围的代码必须传递这些变量的值,例如作为方法参数。如果是NASM,则添加的是地址,而不是值。使用
mov eax,[a]
/添加eax,[b]
等。假设这些名称中有静态/全局符号,而您没有mov-eax,a
是mov-eax,imm32
,地址为a
mov c,eax
是一个语法错误。我假设您正在谈论MSVC的asm{}
块语法?内联asm是特殊的,甚至可以对局部变量使用C标识符。不过MSVC的实现有点糟糕,因为您只能通过内存(而不是寄存器)将数据进出asm块,因此没有循环的短asm{}
块会浪费大量数据移动指令,并导致大量额外延迟。我想这就是为什么他们的内联asm语法不适用于x86-64的部分原因。(可能是因为intrinsic是实现90%内联asm功能的更好方法。)为了澄清这一点,您必须将值发送到参数中的C/asm代码,并将结果作为返回值返回(或使用结果收集器)。代码将不能直接访问Java变量。@Andreas我同意,事实上Java变量对C/ASM代码可能没有任何意义,因为它们可以以任何方式存储(甚至优化为零)+1