Файл компиляции веб-сборки C с ошибкой встроенного языка сборки - PullRequest
0 голосов
/ 04 ноября 2018

Есть ли способ компилировать файл 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

Спасибо.

1 Ответ

0 голосов
/ 04 ноября 2018
Локальные переменные

asm гарантированно работают только с расширенными операторами asm в GNU C. Вы используете их с Basic asm, что может работать, но это не гарантируется. (https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html

И бессмысленно, когда вы можете просто использовать ограничения типа "a"(1UL), чтобы поместить 1 в RAX. Также не забудьте объявить клобберы на RCX и R11 из-за того, как работает syscall, и что RAX также является выходом.


В любом случае, конечно, специфичные для x86 имена регистров не будут работать при компиляции в переносимую платформу-нейтральную / архитектурно-нейтральную web версию, а не напрямую в x86 asm.

В браузере, работающем на процессоре ARM, эти регистры не будут доступны, когда JITing webasm превращается в собственный код. Даже браузер, скомпилированный для 32-битного x86, не будет иметь этих регистров.

Кроме того, в браузере, работающем на x86-64 Windows, эти регистры будут доступны, но ABI системного вызова Linux не будут работать.

AFAIK, вы не можете обернуть специфический для цели встроенный asm и определенные регистры в web-asm, даже если ваша единственная предполагаемая цель - та, где они будут работать. Язык web-asm не предназначен поддержать его.

Когда вы запускаете gcc или clang, целью является WASM, не x86.

...