Operacje na porcie lpt 1 - wstawka do c++

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
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=ContentExpress&func=display&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 moderatora:

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Przesiadz sie na VC++ tam mozesz uzywac takiej skladni jak pisales na poczatku posta.
A najlepiej uzyj WinAsm i tam bedzie napewno najlepiej ;)
 

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
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
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
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
 

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
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
externallink.png
 

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
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
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
co do stdafx to wejdz w opcje projektu i tam masz czy dolaczac stdafx.h
wywal ;)
 
Do góry Bottom