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

Błąd przy użyciu wstawek asemblerowych w DEV C++ 4.9.9.2

rokita 24 Lis 2005 12:34 3682 4
REKLAMA
  • #1 2021467
    rokita
    Poziom 13  
    Posty: 96
    Pomógł: 2
    Ocena: 16
    Mam problem z zastosowaniem wstawek asemblerowych w C++ a dokładnie w kompilatorze DEV C++ wersja 4.9.9.2
    wyskakuje następujący błąd:
    Załączniki:
    • Błąd przy użyciu wstawek asemblerowych w DEV C++ 4.9.9.2 blad c.jpg (49.07 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Błąd przy użyciu wstawek asemblerowych w DEV C++ 4.9.9.2 blad c.jpg (49.07 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2021554
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 42
    DEV-C++ korzysta z MinGW (GCC przeportowane na Windowsa) a wiec obowiazuja tam wstawki zgodne ze specyfikacja GNU.Poczytaj sobie dokladnie na ten temat w dokumentacji GCC a poki co kilka przykladow:

    asm (" move.l 0xC8,%a0
    move.l (%a0,1656),%a0
    jsr (%a0)");

    asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));

    asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar));
  • REKLAMA
  • #3 2024069
    rokita
    Poziom 13  
    Posty: 96
    Pomógł: 2
    Ocena: 16
    Mimo dobrych chęci nic mi to nie mówi. (zamało wiem o asemblerze)
    Mam proźbę jak masz dokumentację GCC w wersji polskiej do daj znać.
    I jeszcze jedna proźba, czy mógbyś przerobić następującą wstawkę żeby poszła w DEV C++

    include <?> // czy jest jakies przewidziane dla wywołania "asm"

    int main(void)
    {
    int port=378; // niewiem czy zmiena ta nadaje sie do podania wartosci portu (chodzi mi o port drukarki LPT1 rejestr danych
    int wartosc=0;
    asm
    {
    mov dx,Port
    mov al,wartosc
    out dx,al
    }
    }

    z góry dziekuje.

    gg= 3319771
  • REKLAMA
  • #4 2024250
    ZlyDotyk
    Poziom 19  
    Posty: 169
    Pomógł: 40
    Ocena: 1
    int port=0x378; // adres hex
    int wartosc=0;

    int main(int argc, char *argv[])
    {
    __asm("mov _port,%dx"); //c++ traktuje int jako dlugie slowo zatem niewiem czy to tak bedzie dobrze ;]
    __asm("mov _wartosc,%al");
    __asm("out %al,%dx"); //to zadziala tylko pod czystym dosem albo win95/98
    }

    w beznadziejnej skladni AT&T wszystkie parametry dla rozkazow przesyla sie odwrotnie. Poczytaj wiecej o niej naprzyklad tutaj: http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

    ...i bym zapomnial - w takich wstawkach wszystkie uzyte rejestry trzeba najpierw odlozyc na stos a na koncu oczywiscie je przywrocic;]
  • #5 2024285
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 42
    rokita napisał:

    include <?> // czy jest jakies przewidziane dla wywołania "asm"

    int main(void)
    {
    int port=378; // niewiem czy zmiena ta nadaje sie do podania wartosci portu (chodzi mi o port drukarki LPT1 rejestr danych
    int wartosc=0;
    asm
    {
    mov dx,Port
    mov al,wartosc
    out dx,al
    }
    }

    Nie jestem niestety pewien ale byc moze cos takiego zadziala:

    asm(mov %0,%dx::"g" (port));
    asm(mov %0,%al::"g" (wartosc));
    asm(out %al,%dx);
REKLAMA