assembler w C + tryb 13h

0

Witam,
Mam problem z kompilacją wstawek assemblerowych przez GCC na Windowsie(mingw).
Nie znam się na assemblerze ale mam kilka gotowych kodów w C z wstawkami asm.
Próbuję dostać się do trybu 13h.. Kod wyglada tak (w uproszczeniu):

int init13h(void)
{
asm( "mov ax, 13h" );
asm( "int 10h" );
return 1;
}

int putpixel(int x,int y,int kolor)
{

    asm(
    "mov ax, 0a000h"
    "Mov Es, Ax"
    "Mov Bx, x"
    "Mov Dx, y"
    "Xchg Dh, Dl"
    "mov ax, kolor"
    "Mov Di, Dx"
    "Shr Di, 1"
    "Shr Di, 1"
    "Add Di, Dx"
    "Add Di, Bx"
    "Stosb"
    );
return 1;
}

Za każdym razem, gdy próbuję to skompilować to wywala mi:

Assembler messages:
too many memory references formov' `

Czy ktoś wie o co tu chodzi?

0

IMHO, kompilatorowi chodzi o to, ze mov ma co prawda dwa operandy, ale nie mozna stosowac dowolnych kombinacji wartosci/rejestrow/adresow w nich - istnieje pewien konkretny zestaw, np. rej<-wart, rej<-rej etc ale nie ma np. mem<-mem. wydaje mi sie ze komunikat o bledzie mowi wlsanie o tej ostatniej operacji [memory-memory, podczas gdy tylko jeden operand mov'a moze byc adresem]
...tylko w tym kodzie co wkleiles, nie widze za chiny nic takiego we wstawkach..

ps. jestes pewien ze ta cala wstawka w ogole jest poprawna? IIR, GCC ma kompletnie inna skladnie!

0

Ja tyszzz patrzę w ten kod i nie wiem co nie działa. Z asm-owegu punktu widzenia powinno być ok.

0

GCC przyjmuje składnię AT&T nieprawdaż ? U Ciebie jest składnia Intela.

0
adf88 napisał(a)

GCC przyjmuje składnię AT&T nieprawdaż ? ...

niekoniecznie: http://www.reversing.be/article.php?story=20051203194931893

0
Oleksy_Adam napisał(a)

Z asm-owegu punktu widzenia powinno być ok.

Jeśli x i y są 32 bitowe to nie jest ok.

Mov Bx, x
Mov Dx, y
0

Faktycznie, kompletnie nie wpadłem na to, ze int(eger) jest takie jaka jest platforma.

1

Żeby ten bezsensowny kod w ogóle się skompilował:

int init13h(void) {
  asm(".intel_syntax noprefix\n"
      "mov ax, 0x13\n"
      "int 0x10\n"
      ".att_syntax prefix"
      : : : "%eax");
  return 1;
}

int putpixel(short int x, short int y, short int kolor) {
  asm(".intel_syntax noprefix\n"
      "mov ax, 0xA000\n"
      "mov es, ax\n"
      "mov bx, %[x]\n"
      "mov dx, %[y]\n"
      "xchg dh, dl\n"
      "mov ax, %[kolor]\n"
      "mov di, dx\n"
      "shr di, 1\n"
      "shr di, 1\n"
      "add di, dx\n"
      "add di, bx\n"
      "stosb\n"
      : : [x] "m" (x), [y] "m" (y), [kolor] "m" (kolor)
      : "%eax", "%ebx", "%edx", "%edi"
      ); 
  asm(".att_syntax prefix");
  return 1;
}

Bezsensowny - to jest 16 bitowy kod wykorzystujący przerwania biosu - być może zadziała w jakiś zabawny sposób na cudzie inżynierii programistycznej jakim jest system z serii windows 9x/ME, ale na tych 32 bitowych porzuć wszelką nadzieję :).

Odpowiedzią na pytanie które chciałeś zadać jest: GDI, GDI+, Allegro, SDL, OpenGL, DirectX etc.
Ewentualnie jeśli jesteś studentem i masz napisać z tymi wstawkami program, musisz użyć 16 bitowego kompilatora C albo napisać całość w assemblerze (tasm, nasm, fasm).

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