Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内联程序集传输变量_Java_Assembly_Inline - Fatal编程技术网

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

您好,我正在尝试使用内联汇编编写简单的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()).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