Java 汇编语言-除了C和C++;允许使用内联代码与程序集交互?
我最近读了一篇题为 <> P>基本上涉及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(
#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 Casm(“lzcnt%1,%0”:“=r”(前导零计数):“rm”(输入)代码>出租th