#include <conio.h> #include <stdlib.h> int AdrIO; static char ValIO; const int MAXX=1024; const int MAXY=768; const int COLORS=255; int setsvga() { __asm("mov ax,0x4f02"); __asm("mov bx,0x105"); __asm("int 0x10"); } int settext(void) { __asm("mov ax,0x0003"); __asm("int 0x10"); } int putpixel(unsigned int x,unsigned int y,unsigned char color) { __asm("mov ah,0x0c"); __asm("mov al,color"); __asm("mov ecx,x"); __asm("mov edx,y"); __asm("mov bx,0x01"); __asm("int 0x10"); } int main() { setsvga(); putpixel(100, 100, 5); settext(); return 0; }
Tollanen koodi. Miksei se toimi. Yritetään siis piirtää pikseliä kohtaan 100x100. Errorit on:
Rivit 12, 13, 30, 50-54: too many memory references for `mov' Rivit 14, 31, 55: suffix or operands invalid for `int'
Kääntäjä on Dev-C++, koodi on peräisi koodivinkistä
Eikö täällä ole yhtään assembly-tietäjää, joka osais korjata ton?
Koodissa saattaa olla muutakin vikaa, mutta Windows-ohjelman ei ole mahdollista siirtyä DOSin näyttötiloihin keskeytyksiä käyttämällä. Asiaa on puitu aiemmin mm. täällä:
https://www.ohjelmointiputka.net/keskustelu/4517-käsitinkö-osoitinmuuttujat-oikein
Ja vielä lisäksi GCC (jota Dev-C++ käyttää, ja toistetaan nyt vielä kerran että Dev-C++ on IDE, joka käyttää kääntäjänään GCC:n Windows-porttia [ainakin defaulttina])haluaa asminsa at&t:n syntaksilla (antamasi koodi on Intelin syntaksia).
edit: jaajaa, taitaapa GCCkin nykyisin syödä ihan Inteliäkin, tosin pientä muokkausta tarvitsee tehdä.
Luin juuri tosta intel - at&t:nä, ja siinä neuvottiin tekemään tolleen. Ennen yritinkin intelin syntaksilla, eikä sekään toiminut.
Tuo koodisi on kyllä nimenomaan Intelin syntaksia. En sitten tarkemmin tiedä miten tarkalleen GCC asminsa haluaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.