Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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 汇编语言-除了C和C++;允许使用内联代码与程序集交互?_Java_C++_C_Assembly_Inline Assembly - Fatal编程技术网

Java 汇编语言-除了C和C++;允许使用内联代码与程序集交互?

Java 汇编语言-除了C和C++;允许使用内联代码与程序集交互?,java,c++,c,assembly,inline-assembly,Java,C++,C,Assembly,Inline Assembly,我最近读了一篇题为 P>基本上涉及C和C++如何允许用户通过一种称为内联程序集的技术使用汇编代码,看起来类似于: #include<stdio.h> void main() { int a = 3, b = 3, c; asm { mov ax,a mov bx,b add ax,bx mov c,ax } printf("%d", c); } #包括 void main(

我最近读了一篇题为

<> P>基本上涉及C和C++如何允许用户通过一种称为内联程序集的技术使用汇编代码,看起来类似于:

#include<stdio.h>
 
void main() {
 
   int a = 3, b = 3, c;
 
   asm {
      mov ax,a
      mov bx,b
      add ax,bx
      mov c,ax
   }
 
   printf("%d", c);
}
#包括
void main(){
int a=3,b=3,c;
asm{
mov-ax,a
mov bx,b
添加ax、bx
mov c,ax
}
printf(“%d”,c);
}

我想知道在java、python等其他高级语言中是否有可能发生类似的交互,或者如果这只是C++和C++的可能。

是,d,RISE,Delphi,还有很多其他的<强>超前编译语言< /St> >有某种形式的内嵌ASM.< /P> Java没有,大多数其他语言也没有,它们通常是通过可移植二进制文件(如Java的.class字节码或C#的CIL)进行JIT编译的

像Python这样的高级语言甚至没有简单的数字对象表示,例如,整数变量不仅仅是一个32位的对象,它有类型信息,并且(特别是在Python中)对于大值可以是任意长度。因此,即使Python实现确实具有内联asm功能,也很难让您对Python对象执行任何操作,除了像C数组一样布局的NumPy数组

可以从大多数高级语言调用本机机器代码函数(例如,从C编译的库或手工编写的asm)——这对于编写某些类型的应用程序通常很重要。例如,在Java中有JNI(Java本机接口)。甚至node.js JavaScript也可以调用本机函数。将参数“编组”为有意义地传递给C函数的形式可能代价高昂,这取决于高级语言以及您是想让C/asm函数修改数组还是只返回值


不同语言中不同形式的内联asm 通常它们不是MSVC的低效形式,就像您使用的那样。更好的设计,比如基于GNUCinlineASM的Rust可以使用寄存器。e、 例如GNU C
asm(“lzcnt%1,%0”:“=r”(前导零计数):“rm”(输入)让编译器选择输出寄存器,并为输入选择寄存器或内存寻址模式

(但更好的做法是使用内部函数
\u lzcnt\u u32
\uuuuu builtin\u clz
对于编译器知道的操作,只有内联asm用于编译器没有内部函数的指令,或者如果您想以某种方式对循环进行微优化。

有些(如Delphi)通过类似于函数调用的“调用约定”进行输入,在寄存器中使用arg,不能完全自由地混合asm和高级代码。因此,它更像是一个具有固定输入的asm块,一个特定寄存器中的输出(加上副作用),编译器可以像函数一样内联


对于您显示的有效语法

    <>你必须手动保存/恢复你在ASM块内使用的每个寄存器(除非你封装了一个大的循环——显然Borland Turbo C++是这样的),否则性能很差登记
  • 或者编译器必须理解每一条指令才能知道它可能写入的寄存器(MSVC是这样的)。Rust的内联asm的设计说明/讨论中提到了这一要求,以及需要做多少额外工作,特别是对于新ISA的可移植性

请注意,MSVC的内联asm的具体实现非常脆弱和笨拙,这意味着它根本不支持x86-64或ARM/AArch64,其中标准调用约定使用register args。相反,它们为基本上每个指令提供内含,包括特权代码,如代码> INVLPG/COD>,使得可以在VisualC++中编写内核(如Windows)。(其他编译器希望您使用
asm()
来实现这些功能)。Windows几乎肯定有几个部分是用单独的.asm文件编写的,比如中断和系统调用入口点,可能还有一个上下文切换函数,它必须加载一个新的堆栈指针,但是有了良好的内部支持,如果您相信编译器自己能够制作出足够好的asm,您就不需要asm了。

是的,D,Rust,Delphi,还有相当多的其他提前编译语言具有某种形式的内联asm

Java没有,大多数其他语言也没有,它们通常是通过可移植二进制文件(如Java的.class字节码或C#的CIL)进行JIT编译的

像Python这样的高级语言甚至没有简单的数字对象表示,例如,整数变量不仅仅是一个32位的对象,它有类型信息,并且(特别是在Python中)对于大值可以是任意长度。因此,即使Python实现确实具有内联asm功能,也很难让您对Python对象执行任何操作,除了像C数组一样布局的NumPy数组

可以从大多数高级语言调用本机机器代码函数(例如,从C编译的库或手工编写的asm)——这对于编写某些类型的应用程序通常很重要。例如,在Java中有JNI(Java本机接口)。甚至node.js JavaScript也可以调用本机函数。将参数“编组”为有意义地传递给C函数的形式可能代价高昂,这取决于高级语言以及您是想让C/asm函数修改数组还是只返回值


不同语言中不同形式的内联asm 通常它们不是MSVC的低效形式,就像您使用的那样。更好的设计,比如基于GNUCinlineASM的Rust可以使用寄存器。e、 例如GNU C
asm(“lzcnt%1,%0”:“=r”(前导零计数):“rm”(输入)出租th