logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C++: Błąd kompilacji w Dev-C++ 4.9.9.2 przy użyciu inline assemblera

mufi 04 Mar 2005 21:43 1734 6
REKLAMA
  • #1 1286792
    mufi
    Poziom 12  
    Posty: 99
    Pomógł: 2
    Ocena: 3
    znalazłem program tutaj na forum elektrody pod adresem : https://www.elektroda.pl/rtvforum/topic96492.html

    ---------------------------

    #include <iostream.h>
    #include <stdlib.h>

    void zapisz(char dana);

    main(){
    char liczba;
    cout<<"Wpisz wartosc do wystawienia na porcie...";
    cin>>liczba;
    zapisz(liczba);
    return(0);
    }

    void zapisz(char dana){
    __asm{
    mov dx,0378h
    mov al,dana
    out dx,al
    }
    system("pause");
    }

    ---------------------------------

    nie potrafie go skąpilować u siebie, korzystam w szkole z kompilatora Dev-C++ 4.9.9.2 i nie chciałbym go zamieniać, nie wiem w czym jest bląd. Dostaje następujące komunikaty:

    ------------------------------------

    Wykonywanie g++.exe...
    g++.exe "D:MarcinLPT_1.cpp" -o "D:MarcinLPT_1.exe" -I"C:Dev-Cpplibgccmingw323.4.2include" -I"C:Dev-Cppincludec++3.4.2backward" -I"C:Dev-Cppincludec++3.4.2mingw32" -I"C:Dev-Cppincludec++3.4.2" -I"C:Dev-Cppinclude" -L"C:Dev-Cpplib"
    In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31,
    from D:MarcinLPT_1.cpp:1:
    C:/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
    D:MarcinLPT_1.cpp: In function `void zapisz(char)':
    D:MarcinLPT_1.cpp:15: error: expected `(' before '{' token
    D:MarcinLPT_1.cpp:15: error: expected asm body before '{' token
    D:MarcinLPT_1.cpp:16: error: `mov' undeclared (first use this function)
    D:MarcinLPT_1.cpp:16: error: (Each undeclared identifier is reported only once for each function it appears in.)
    D:MarcinLPT_1.cpp:16: error: expected `;' before "dx"

    D:MarcinLPT_1.cpp:16:8: invalid digit "8" in octal consta

    ---------------------------------

    Ten program to odpowiedz, na czesc pytan na które jeszce nie umiałem do tej pory odpowiedziec. Chce koniecznie pobawić sie LPT sterować tymi wejsciami D0-D7. Tylko właśnie nie potrafie sobie poradzić z tym programem, prosze o pomoc. korzystam z windowsa XP, nie chciałbym zmieniac tego kompilatora jeżeli to możliwe, co mam zrobić żeby to działało ? z góry dziękuje mufi :)
  • REKLAMA
  • #2 1287291
    bialy
    Poziom 17  
    Posty: 227
    Pomógł: 10
    Ocena: 54
    Zeby zlikwidowac to :
    C:/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated. 


    Dopisz pod ostatnim include usinag namespace std;

    A reszta bledow wyglada jak by program byl zle przepisany. main zwraca 0 a nie ma zadeklarowanego jak by mial zwracac.

    Teraz 2 sprawa w Xp nie ma besposredniego dostepu do portow wiec nawet jak sie skompiluje to nie zadziala. Uzyj CreateFile WriteFile
  • REKLAMA
  • #3 1288713
    mufi
    Poziom 12  
    Posty: 99
    Pomógł: 2
    Ocena: 3
    sciągnołem sobie taki program "UserPort" to ponoć likwiduje ten błąd z dostępem do portów w XP, a program skopiowałem, u jego włąściciela działą poprawnie, także dalej jestem w kropce. ale dzieki :)
  • #4 1290541
    bialy
    Poziom 17  
    Posty: 227
    Pomógł: 10
    Ocena: 54
    To ze XP nie daje dostepu do portow to wcale nie jest blad. To bylo zamiezone i dobrze ze tak jest.

    poczytaj faq od dev-c++
    
    asm("movl %dx,$0x378\n\t"
          "movl %al,$_dana\n\t"
          "out %dx,%al\n\t");
  • REKLAMA
  • #5 1291998
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38946
    Pomógł: 3179
    Ocena: 6570
    Po pierwsze co to jest kąpilacja?

    DevCpp, jak widać ma inny nagłówek wstawki assemblerowej i o ile pamiętam ma jakieś wymogi co do zapisu liczb szesnastkowych (może 0x378h).
  • REKLAMA
  • #6 1292077
    mufi
    Poziom 12  
    Posty: 99
    Pomógł: 2
    Ocena: 3
    tzok nie wiesz co to jest kąpilacja to idz stąd ok ? bedzie sie czepiał cwaniak, lepiej bys pomógł

    Dodano po 14 [sekundy]:

    tzok nie wiesz co to jest kąpilacja to idz stąd ok ? bedzie sie czepiał cwaniak, lepiej bys pomógł
  • #7 1292166
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38946
    Pomógł: 3179
    Ocena: 6570
    GCC (którego używa DevCpp) nie obsługuje/obsługuje zupełnie inaczej kod assemblerowey wewnątrz funkcji (inline assembler). Dla Buildera/Visual C++ ten kod jest w zasadzie poprawny.
    #include <cstdlib>
    #include <stdio>
    
    using namespace std;
    
    void zapisz(char);
    
    int main(int argc, char *argv[])
    {
        char liczba;
        printf("Wpisz wartosc do wystawienia na porcie: ");
        scanf("%s", &liczba);
        zapisz(liczba);
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    void zapisz(char dana)
    { 
    __asm{
           mov dx,0x378
           mov al,dana
           out dx,al}
    }

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy błędu kompilacji programu w Dev-C++ 4.9.9.2, który wykorzystuje inline assembler do bezpośredniego dostępu do portu 0x378. Kod źródłowy używa składni inline assemblera charakterystycznej dla Visual C++, która nie jest obsługiwana przez kompilator GCC używany w Dev-C++. Ponadto, w systemie Windows XP i nowszych bezpośredni dostęp do portów sprzętowych jest zablokowany, co uniemożliwia działanie programu nawet po poprawnej kompilacji. Zalecane jest użycie funkcji systemowych takich jak CreateFile i WriteFile do komunikacji z portami. Wskazano również na konieczność aktualizacji nagłówków C++ (np. użycie zamiast przestarzałego ) oraz poprawne zadeklarowanie funkcji main. Przykładowa poprawiona wersja kodu z inline assemblerem dostosowanym do GCC została zaprezentowana, jednak nadal wymaga odpowiednich uprawnień i środowiska do działania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA