【问题标题】:Web Assembly compile C file with inline Assembly Language errorWeb Assembly 编译 C 文件时出现内联汇编语言错误
【发布时间】:2018-11-04 01:34:06
【问题描述】:

有没有办法用 Web Assembly 编译带有内联汇编语言的 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

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

谢谢。

【问题讨论】:

    标签: javascript c assembly emscripten webassembly


    【解决方案1】:

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

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


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

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

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

    AFAIK,您不能在 web-asm 中包装特定于目标的内联 asm 和特定寄存器,即使您唯一的预期目标是它们可以工作的目标。 web-asm 语言不是旨在支持它。

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

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多