Web程序集编译C文件时出现内联程序集语言错误



有没有一种方法可以用Web Assembly用内联汇编语言编译C文件?

emcc(类似Emscripten gcc/clang的替换+模拟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") = "hello, worldn";
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

还编译了这个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

这些是错误:

warning: unexpected number of arguments 0 in call to 'test', should be 1
warning: unresolved symbol: test

谢谢。

asm局部变量只能保证与GNU C中的扩展asm语句一起使用。您将它们与Basic asm一起使用,这可能会起作用,但不能保证。(https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html

当您可以使用像"a"(1UL)这样的约束来在RAX中放置1时,这是毫无意义的。另外,不要忘记在RCX和R11上声明clobber,因为syscall是如何工作的,而且RAX也是一个输出。


无论如何,当编译到可移植平台无关/架构无关的web程序集而不是直接编译到x86 asm时,x86特定的寄存器名当然不起作用

在ARM CPU上运行的浏览器在将webasm移植到本机代码中时将没有这些寄存器可用。即使是为32位x86编译的浏览器也不会有这些寄存器。

此外,在x86-64 Windows上运行的浏览器将有这些寄存器可用,但Linux系统调用ABI不起作用。

AFAIK,您不能在web asm中包装特定于目标的内联asm和特定寄存器,即使您唯一的目标是它们可以工作的地方web asm语言不是为支持它而设计的。

当您运行gcc或clang时,目标是WASM,而不是x86。

相关内容

  • 没有找到相关文章

最新更新