+ Odpowiedz na ten temat
Pokaż wyniki od 1 do 9 z 9

Temat: Operacje na porcie lpt 1 - wstawka do c++

  1. #1
    Użytkownik
    Dołączył
    20-06-2008
    Skąd
    Wrocław
    Posty
    25

    Domyślnie Operacje na porcie lpt 1 - wstawka do c++

    Piszę program w c++ (deva używam) do obsługi portu lpt 1 aby po podłączeniu układu elektronicznego zaświeciły się diody led - w googlach dużo jest różnych sposobów żeby to napisać, ja wybrałem sposób poprzez asemblera - wstawke do c++. I tu zaczynają się dla mnie schody bo z asemblerem nie miałem nigdy do czynienia. Opis kodu wziąłem z tąd
    http://elportal.pl/index.php?module=...splay&ceid=150
    Kod ten jest napisany trochę inaczej dev mi go nie łapał więc go zmieniłem z takiego (oryginalnego)

    Kod:
    void WriteDataToPort ( unsigned short port_address, unsigned char port_data ) {
        __asm {
            ; do rejestru DX podajemy adres portu I/O
            mov dx, port_address
            ; do rejestru AL podajemy bajt do wysłania na port
            mov al, port_data
            ; i wysyłamy...
            out dx, al
        }
    }
    na taki

    Kod:
    void WriteDataToPort(unsigned short port_address, unsigned char port_data) 
    {
    asm
         (
              //; do rejestru DX podajemy adres portu I/O
            "mov dx, port_address \n"
            //; do rejestru AL podajemy bajt do wysłania na port
            "mov al, port_data \n"
             //; i wysyłamy...
            "out dx, al \n"
         );
    }
    Tylko, że to też nie działa wyskakiwał mi błąd, że " Assembler messages: too many memory references for `mov' i tak samo dla drugiego mova i too many memory references for `out'" . Później trochę poczytałem w necie i zmieniłem na takie coś

    Kod:
    void WriteDataToPort(unsigned short port_address, unsigned char port_data) 
    {
    asm
    	 (
            //; do rejestru DX podajemy adres portu I/O
            "mov port_address, %dx \n"
            //; do rejestru AL podajemy bajt do wysłania na port
            "mov port_data, %al  \n"
             //; i wysyłamy...
            //"out dx, %al  \n"
         );
    }
    I dalej mi nie działa błąd " Assembler messages: suffix or operands invalid for `out' ".
    W sumie nie wiem nic o co chodzi. Może mi ktoś powiedzieć co źle zrobiłęm i najlepiej zmienić ten oryginalny kod na poprawny, który będzie chodził pod xp i viste i 7. Jak już mówiłem używam dev c++ i jeszcze includem władowałem iostreama i windows.h.
    Ostatnio edytowane przez hxv ; 19-08-2010 o 21:39

  2. #2
    Dawni Moderatorzy Avatar grzonu
    Dołączył
    26-12-2006
    Skąd
    Gdansk, Poland, Poland
    Posty
    1 382

    Domyślnie

    Przesiadz sie na VC++ tam mozesz uzywac takiej skladni jak pisales na poczatku posta.
    A najlepiej uzyj WinAsm i tam bedzie napewno najlepiej
    Filmy online---Grzonu Blog

    1) Moje gg to nie pomoc techniczna w obsludze keyloggerow!!! Na gg i pw pomagam tylko w kwestiach organizacyjnych forum. Masz problem to pisz na forum.
    2) Nie zajmuje sie malware a uprzedzajac pytanie "czemu?" - bo taki mam kaprys!

  3. #3
    Użytkownik
    Dołączył
    20-06-2008
    Skąd
    Wrocław
    Posty
    25

    Domyślnie

    A nie da się tego w devie zrobić ? Szczerze mówiąc wole na razie nie przesiadać się na inny kompilator, tylko korzystać z samych wstawek. Nie widzisz błędu w drugim kodzie ? Przeczytałem w necie, że są trzy typy pisania wstawek assemblerowych w c++ jedna z nich to ta pierwsza, u mnie nie chodzi a druga to ta użyta w drugim kodzie

  4. #4
    Dawni Moderatorzy Avatar grzonu
    Dołączył
    26-12-2006
    Skąd
    Gdansk, Poland, Poland
    Posty
    1 382

    Domyślnie

    Dev to poprostu proste srodowisko ale do zastosowan jak sie uczysz c++ a nie do wspolpracy ze wstawkami asma. Naprawde warto sie przesiasc na VC++.
    Docenisz to po chwili naprawde Kod wypluwa mniejszy i w necie kazdy kod [pd windows jaki znajdziesz w zasadzie jest zgodny z VC++.
    Mozesz tez ten kod przerobic na shellcode i go poprostu gdzies wrzucic do pamieci i wykonac ;D
    Filmy online---Grzonu Blog

    1) Moje gg to nie pomoc techniczna w obsludze keyloggerow!!! Na gg i pw pomagam tylko w kwestiach organizacyjnych forum. Masz problem to pisz na forum.
    2) Nie zajmuje sie malware a uprzedzajac pytanie "czemu?" - bo taki mam kaprys!

  5. #5
    Użytkownik (R) Avatar D.F.
    Dołączył
    04-11-2009
    Skąd
    Polska
    Posty
    203

    Domyślnie

    Wiem, że można jakąś dyrektywą przestawić składnię na Intel, zamiast AT&T. Druga opcja to poszukanie gdzieś jak ten kod dobrze zapisać w składni AT&T.

    Albo tak jak napisał Grzonu, przejdź na inny kompilator.

    Znalazłem taki tekst:
    GCC-Inline-Assembly-HOWTO

  6. #6

    Domyślnie

    Jeśli chcesz program do xp oraz win7, jednak masz mieć sterovnika. zobacz tą stroną: http://logix4u.net/Legacy_Ports/Parallel_Port.html - tam możesz sciągnuć inpout32.dll i używać tylko 2 funkcji - Inp32 a Out32. Tam są przykłady do C.
    szurik

  7. #7
    Użytkownik
    Dołączył
    20-06-2008
    Skąd
    Wrocław
    Posty
    25

    Domyślnie

    Przesiadłem się na MV C++ i w sumie lepszy od deva jest tylko jeszcze się nie łapie do końca w obsłudze. Kod się kompiluje, ale kompilator podpowiedział mi żebym dołożył bibliotekę #include "StdAfx.h" w sumie nie wiem dlaczego.. Czy program działa dowiem się dopiero jak skończe cały program pisać i podłaczę do lpt układ z diodami...Wszystkim dzięki za pomoc. A co do sterownika to już jakiegoś zainstalowałem

  8. #8
    Dawni Moderatorzy Avatar grzonu
    Dołączył
    26-12-2006
    Skąd
    Gdansk, Poland, Poland
    Posty
    1 382

    Domyślnie

    co do stdafx to wejdz w opcje projektu i tam masz czy dolaczac stdafx.h
    wywal
    Filmy online---Grzonu Blog

    1) Moje gg to nie pomoc techniczna w obsludze keyloggerow!!! Na gg i pw pomagam tylko w kwestiach organizacyjnych forum. Masz problem to pisz na forum.
    2) Nie zajmuje sie malware a uprzedzajac pytanie "czemu?" - bo taki mam kaprys!

  9. #9

    Domyślnie

    Jak chcesz składnię intelowską w Devie (właściwie w GCC) to walnij:
    Kod:
    asm(".intel_syntax\n"
    "jakieśtaminstrukcje\n"
    ".att_syntax\n");

+ Odpowiedz na ten temat

Uprawnienia

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów