Integracja ASM w CLion

0

Cześć,
Jak zintegrować wstawki asm w CLion?
Z góry dziękuję

Log z CLion:

====================[ Build | rpiTime | Debug ]=================================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --target rpiTime -- -j 4
Scanning dependencies of target rpiTime
[ 50%] Building CXX object CMakeFiles/rpiTime.dir/main.cpp.o
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:19:7: error: brackets expression not supported on this target
  asm("\
      ^
<inline asm>:1:19: note: instantiated into assembly here
                mov eax, [ebp + 8] 
                         ^
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:21:1: error: brackets expression not supported on this target
        add eax, [ebp + 12] \n\
^
<inline asm>:2:18: note: instantiated into assembly here
        add eax, [ebp + 12] 
                 ^
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:22:1: error: unknown use of instruction mnemonic without a size suffix
        add eax, 1 \n\
^
<inline asm>:3:9: note: instantiated into assembly here
        add eax, 1 
        ^
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:23:1: error: brackets expression not supported on this target
        mov [ebp-4], eax \n\
^
<inline asm>:4:13: note: instantiated into assembly here
        mov [ebp-4], eax 
            ^
4 errors generated.
make[3]: *** [CMakeFiles/rpiTime.dir/main.cpp.o] Error 1
make[2]: *** [CMakeFiles/rpiTime.dir/all] Error 2
make[1]: *** [CMakeFiles/rpiTime.dir/rule] Error 2
make: *** [rpiTime] Error 2
1

Na czym ma działać ten kod? x86, ARM?

0
Wibowit napisał(a):

Na czym ma działać ten kod? x86, ARM?

Plik CMakeList.txt:

cmake_minimum_required(VERSION 3.14)
project(rpiTime)

set(CMAKE_CXX_STANDARD 14)

add_executable(rpiTime main.cpp)

A reszta powinna być na x86

1

Coby było jasne: rpi nie jest u Ciebie skrótem od raspberry pi, prawda?

1

Jeśli projekt jest na pewno na x86 to jeszcze dochodzi kwestia składni. Istnieje "Intel syntax" oraz "AT&T syntax": https://en.wikipedia.org/wiki/X86_assembly_language#Syntax

0

Dodaj flagę -masm=intel do CMAKE_C_FLAGS CMAKE_CXX_FLAGS.

Generalnie odradzałbym pisanie kodu w assemblerze jeśli nie jest to sterownik lub coś innego niskopoziomowego.

0
MarekR22 napisał(a):

Dodaj flagę -masm=intel do CMAKE_C_FLAGS CMAKE_CXX_FLAGS.

Generalnie odradzałbym pisanie kodu w assemblerze jeśli nie jest to sterownik lub coś innego niskopoziomowego.

MarekR22 napisał(a):

Dodaj flagę -masm=intel do CMAKE_C_FLAGS CMAKE_CXX_FLAGS.

Generalnie odradzałbym pisanie kodu w assemblerze jeśli nie jest to sterownik lub coś innego niskopoziomowego.
Dodałem ale nic się nie zmieniło, chyba że źle dodałem

CmakeList.txt

cmake_minimum_required(VERSION 3.14)
project(rpiTime)


set(CMAKE_CXX_STANDARD 14)

set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -masm=intel)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -masm=intel)

add_executable(rpiTime main.cpp)

Spróbowałem jeszcze ze zwykłym g++:

mikolaj@MBP-Mikoaj rpiTime % g++ -masm=intel -Wall -pedantic main.cpp 
main.cpp:26:10: warning: variable 'suma' is uninitialized when used here
      [-Wuninitialized]
  return suma;
         ^~~~
main.cpp:17:11: note: initialize the variable 'suma' to silence this warning
  int suma;
          ^
           = 0
main.cpp:35:2: warning: no newline at end of file [-Wnewline-eof]
}
 ^
main.cpp:19:7: error: brackets expression not supported on this target
  asm("\
      ^
<inline asm>:1:19: note: instantiated into assembly here
                mov eax, [ebp + 8] 
                         ^
main.cpp:21:1: error: brackets expression not supported on this target
        add eax, [ebp + 12] \n\
^
<inline asm>:2:18: note: instantiated into assembly here
        add eax, [ebp + 12] 
                 ^
main.cpp:22:1: error: unknown use of instruction mnemonic without a size suffix
        add eax, 1 \n\
^
<inline asm>:3:9: note: instantiated into assembly here
        add eax, 1 
        ^
main.cpp:23:1: error: brackets expression not supported on this target
        mov [ebp-4], eax \n\
^
<inline asm>:4:13: note: instantiated into assembly here
        mov [ebp-4], eax 
            ^
2 warnings and 4 errors generated.
0
MarekR22 napisał(a):

https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html
-x assembler-with-cpp

Nwm czy czegoś nie maściłem...

main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
0

Daj jakiś fragment kodu, żebyśmy mogli sami przetestować.
MCVE

0

#include <iostream>

using namespace std;

int fun1(int a, int b)
{
    int suma;

    suma = a + b;
    suma = suma + 1;

    return suma;
}

int fun2(int a, int b)
{
    int suma;

    asm("\
        mov eax, [ebp + 8] \n\
        add eax, [ebp + 12] \n\
        add eax, 1 \n\
        mov [ebp-4], eax \n\
    ");

    return suma;
}

int main()
{
    cout << "C++: " << fun1(3,5) << endl;
    cout << "assembler: " << fun2(3,5) << endl;

    return 0;
}

1

z -masm=intel kompiluje się (jest crash): https://wandbox.org/permlink/Y2NUWjcAZKJNmYsV

Popraw cmake za pomocą cudzysłowy:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" "-masm=intel")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" "-masm=intel")

I sprawdź dokładnie w logach jakie flagi dostaje kompilator.

0
MarekR22 napisał(a):

z -masm=intel kompiluje się (jest crash): https://wandbox.org/permlink/Y2NUWjcAZKJNmYsV

Popraw cmake za pomocą cudzysłowy:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" "-masm=intel")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" "-masm=intel")

I sprawdź dokładnie w logach jakie flagi dostaje kompilator.

====================[ Build | rpiTime | Debug ]=================================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --target rpiTime -- -j 4
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -S/Users/mikolaj/CLionProjects/rpiTime -B/Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --check-build-system CMakeFiles/Makefile.cmake 0
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/Makefile2 rpiTime
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -S/Users/mikolaj/CLionProjects/rpiTime -B/Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_progress_start /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug/CMakeFiles 2
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/Makefile2 CMakeFiles/rpiTime.dir/all
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/rpiTime.dir/build.make CMakeFiles/rpiTime.dir/depend
cd /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug && /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_depends "Unix Makefiles" /Users/mikolaj/CLionProjects/rpiTime /Users/mikolaj/CLionProjects/rpiTime /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug/CMakeFiles/rpiTime.dir/DependInfo.cmake --color=
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/rpiTime.dir/build.make CMakeFiles/rpiTime.dir/build
[ 50%] Building CXX object CMakeFiles/rpiTime.dir/main.cpp.o
/Library/Developer/CommandLineTools/usr/bin/c++    ;-masm=intel -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk   -std=gnu++14 -o CMakeFiles/rpiTime.dir/main.cpp.o -c /Users/mikolaj/CLionProjects/rpiTime/main.cpp
clang: error: no input files
/bin/sh: -masm=intel: command not found
make[3]: *** [CMakeFiles/rpiTime.dir/main.cpp.o] Error 127
make[2]: *** [CMakeFiles/rpiTime.dir/all] Error 2
make[1]: *** [CMakeFiles/rpiTime.dir/rule] Error 2
make: *** [rpiTime] Error 2
0

Teraz siedzę na Windows, więc sam musisz popróbować.

Z tego co widzę w logach to wcisnęło ci średnik nie tam gdzie trzeba. Tak cmake rozdziela wartości w liście.
Żeby tego uniknąć to nie może być lista, ergo są dwa międzysłowia za dużo. Na tej podstwię twierdzę, że powinno być tak:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -masm=intel")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -masm=intel")
0
MarekR22 napisał(a):

Teraz siedzę na Windows, więc sam musisz popróbować.

Z tego co widzę w logach to wcisnęło ci średnik nie tam gdzie trzeba. Tak cmake rozdziela wartości w liście.
Żeby tego uniknąć to nie może być lista, ergo są dwa międzysłowia za dużo. Na tej podstwię twierdzę, że powinno być tak:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -masm=intel")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -masm=intel")

Tak jakby wróciło do punktu wyjścia.

====================[ Build | rpiTime | Debug ]=================================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --target rpiTime -- -j 4
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -S/Users/mikolaj/CLionProjects/rpiTime -B/Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --check-build-system CMakeFiles/Makefile.cmake 0
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/Makefile2 rpiTime
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -S/Users/mikolaj/CLionProjects/rpiTime -B/Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_progress_start /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug/CMakeFiles 2
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/Makefile2 CMakeFiles/rpiTime.dir/all
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/rpiTime.dir/build.make CMakeFiles/rpiTime.dir/depend
cd /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug && /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_depends "Unix Makefiles" /Users/mikolaj/CLionProjects/rpiTime /Users/mikolaj/CLionProjects/rpiTime /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug /Users/mikolaj/CLionProjects/rpiTime/cmake-build-debug/CMakeFiles/rpiTime.dir/DependInfo.cmake --color=
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/rpiTime.dir/build.make CMakeFiles/rpiTime.dir/build
[ 50%] Building CXX object CMakeFiles/rpiTime.dir/main.cpp.o
/Library/Developer/CommandLineTools/usr/bin/c++    -masm=intel -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk   -std=gnu++14 -o CMakeFiles/rpiTime.dir/main.cpp.o -c /Users/mikolaj/CLionProjects/rpiTime/main.cpp
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:19:7: error: brackets expression not supported on this target
  asm("\
      ^
<inline asm>:1:19: note: instantiated into assembly here
                mov eax, [ebp + 8] 
                         ^
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:21:1: error: brackets expression not supported on this target
        add eax, [ebp + 12] \n\
^
<inline asm>:2:18: note: instantiated into assembly here
        add eax, [ebp + 12] 
                 ^
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:22:1: error: unknown use of instruction mnemonic without a size suffix
        add eax, 1 \n\
^
<inline asm>:3:9: note: instantiated into assembly here
        add eax, 1 
        ^
/Users/mikolaj/CLionProjects/rpiTime/main.cpp:23:1: error: brackets expression not supported on this target
        mov [ebp-4], eax \n\
^
<inline asm>:4:13: note: instantiated into assembly here
        mov [ebp-4], eax 
            ^
4 errors generated.
make[3]: *** [CMakeFiles/rpiTime.dir/main.cpp.o] Error 1
make[2]: *** [CMakeFiles/rpiTime.dir/all] Error 2
make[1]: *** [CMakeFiles/rpiTime.dir/rule] Error 2
make: *** [rpiTime] Error 2
2

Co to za wysyp pytań o wstawki asmowe ostatnio na forum?

Ja odpowiem jak zwykle - nie robić wstawek, robić osobne pliki .asm; kompilować je na przykład NASMem i wlinkowywać wynikowe .o do programu tak samo jak całą resztę.
Jak to wyklikać w danym IDE to już inna sprawa…

0

A może powinno paść pytanie czy jest konieczne używanie CLion?

Często IDE to "sztucznie nadmuchany kombajn" do rzeczy prostych. W wielu przypadkach wystarcza nieco bardziej wyrafinowany edytor i kilka narzędzi zewnętrznych by opanować takie problemy z kodem w projekcie. Czasem "kopanie się z koniem" w postaci przekonywania IDE że ma coś zrobić (a on nie ma zamiaru), to strata czasu który można pożytkować efektywniej. Tym bardziej że są (i będą) projekty w których dane IDE nie będzie sobie radziło. A odkrywanie dlaczego sobie nie radzi, to nie jest cel zbieżny z projektem :)

0

I teraz człowiek sobie uświadamia, że jest zajebiste środowisko do programowania w c++, o którym nie wiedział xd

Tak jak ludzie pisali,
Kompilator może czasem nie wiedzieć, czy używasz składni intela czy at.
I też może być problem z tym w jaki sposób wstawka jest obsługiwana.
Musisz sprawdzić jaki kompilator masz pod tym Clion, i przy pod intela to kompilujesz, legendy głoszą, że ktoś pod at składnią napisał cokolwiek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1