Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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/4/c/57.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
Javascript Web程序集编译C文件时出现内联汇编语言错误_Javascript_C_Assembly_Emscripten_Webassembly - Fatal编程技术网

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

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

有没有一种方法可以用内联汇编语言和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") = "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