Javascript Web程序集编译C文件时出现内联汇编语言错误
有没有一种方法可以用内联汇编语言和Web汇编来编译C文件 emcc(Emscripten gcc/clang-like替换+模拟GNU ld的链接器)1.38.12 尝试编译此文件时:Javascript Web程序集编译C文件时出现内联汇编语言错误,javascript,c,assembly,emscripten,webassembly,Javascript,C,Assembly,Emscripten,Webassembly,有没有一种方法可以用内联汇编语言和Web汇编来编译C文件 emcc(Emscripten gcc/clang-like替换+模拟GNU ld的链接器)1.38.12 尝试编译此文件时: int main(void) { register int syscall_no asm("rax") = 1; register int arg1 asm("rdi") = 1; register char* arg2 asm("rsi") = "hell
int main(void) {
register int syscall_no asm("rax") = 1;
register int arg1 asm("rdi") = 1;
register char* arg2 asm("rsi") = "hello, world\n";
register int arg3 asm("rdx") = 14;
asm("syscall");
return 0;
}
以下是错误:
test.c:2:35: error: unknown register name 'rax' in asm
register int syscall_no asm("rax") = 1;
^
test.c:3:35: error: unknown register name 'rdi' in asm
register int arg1 asm("rdi") = 1;
^
test.c:4:35: error: unknown register name 'rsi' in asm
register char* arg2 asm("rsi") = "hello, world!\n";
^
test.c:5:35: error: unknown register name 'rdx' in asm
register int arg3 asm("rdx") = 14;
^
4 errors generated.
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting
warning: unexpected number of arguments 0 in call to 'test', should be 1
warning: unresolved symbol: test
还编译了此C文件:
int main(){
int test();
test()
}
链接到此部件文件的:
SECTION .text
GLOBAL test
test:
mov rax,1
mov rdi,1
mov rsi,name
mov rdx,7
syscall
mov rax,60
mov rdi,0
syscall
SECTION .data
name DB "Hello",10
以下是错误:
test.c:2:35: error: unknown register name 'rax' in asm
register int syscall_no asm("rax") = 1;
^
test.c:3:35: error: unknown register name 'rdi' in asm
register int arg1 asm("rdi") = 1;
^
test.c:4:35: error: unknown register name 'rsi' in asm
register char* arg2 asm("rsi") = "hello, world!\n";
^
test.c:5:35: error: unknown register name 'rdx' in asm
register int arg3 asm("rdx") = 14;
^
4 errors generated.
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting
warning: unexpected number of arguments 0 in call to 'test', should be 1
warning: unresolved symbol: test
谢谢。asm局部变量只能保证与GNU C中的扩展asm语句一起使用。您将它们与基本asm一起使用,基本asm可能会正常工作,但不能保证。( 当您可以使用像
“a”(1UL)
这样的约束将1
放入RAX中时,这是毫无意义的。另外,不要忘记在RCX和R11上声明clobbers,因为syscall
是如何工作的,而且RAX也是一个输出
无论如何,当编译到与平台无关/与体系结构无关的可移植web程序集而不是直接编译到x86 asm时,x86特定的寄存器名当然不起作用。 当将webasm JIT为本机代码时,运行在ARM CPU上的浏览器不会有这些寄存器可用。即使是为32位x86编译的浏览器也不会有这些寄存器 此外,在x86-64 Windows上运行的浏览器将有这些寄存器可用,但Linux系统调用ABIs将无法工作 好的,您不能在web asm中包装特定于目标的内联asm和特定寄存器,即使您唯一想要的目标是它们可以工作的目标。web asm语言不是为支持它而设计的
当您运行gcc或clang时,目标是WASM,而不是x86。asm局部变量只保证与GNU C中的扩展asm语句一起工作。您将它们与基本asm一起使用,基本asm可能会正常工作,但不能保证( 当您可以使用像
“a”(1UL)
这样的约束将1
放入RAX中时,这是毫无意义的。另外,不要忘记在RCX和R11上声明clobbers,因为syscall
是如何工作的,而且RAX也是一个输出
无论如何,当编译到与平台无关/与体系结构无关的可移植web程序集而不是直接编译到x86 asm时,x86特定的寄存器名当然不起作用。 当将webasm JIT为本机代码时,运行在ARM CPU上的浏览器不会有这些寄存器可用。即使是为32位x86编译的浏览器也不会有这些寄存器 此外,在x86-64 Windows上运行的浏览器将有这些寄存器可用,但Linux系统调用ABIs将无法工作 好的,您不能在web asm中包装特定于目标的内联asm和特定寄存器,即使您唯一想要的目标是它们可以工作的目标。web asm语言不是为支持它而设计的 运行gcc或clang时,目标是WASM,而不是x86