PDA

Visualizza la versione completa : C + asm();


matti96
15-03-2013, 23:53
Salve! Vorrei fare una funzione che stampa un determinato carattere di un determinato colore. Non riesco però a scrivere l'assembly in modo che il progamma lo legga correttamente.


#include <stdio.h>
void cprintc(char, char);

int main()
{
cprintc('a', 0x60);
getchar();
}

void cprintc(char ch, char f)
{
/*asm("MOV CX, 1\
MOV BL, col\
MOV AL, ch\
MOV AH, 09\
int 10");
*/
asm("mov $1, %cx\n\
mov $9, %ah\n\
mov ch, %al\n\
mov f, %bl\n\
int $10"
);
}


[Linker error] undefined reference to `ch'
[Linker error] undefined reference to `f'


Idem se metto '$ch' e '$f' anziche 'ch' e 'f'


La funzione ASM è questa:
http://www.giobe2000.it/tutorial/LivelloBios/Bios10_09.htm

MItaly
16-03-2013, 02:50
L'esatto uso dei blocchi asm dipende dal compilatore che stai usando... Inoltre, tieni conto che le chiamate BIOS per l'output grafico non si usano dai tempi del DOS. :stordita:

oregon
16-03-2013, 09:27
Ma con quale compilatore lavori? Con quale sistema operativo?

matti96
16-03-2013, 12:42
Scusate, avevo dimenticato i dettagli :)
Le istruzioni sono dell'8086, lavoro su win7 a 32 bit e quelle istruzioni sul debug.exe mi funzionano... Uso Dev-cpp (non picchiatemi, ho formattato il pc e non ho visual studio)
Se no come potrei scrivere la funzione? Dovrebbe stampare un carattere con un determinato colore di sfondo (del dos essendo in console) e di un colore per il carattere...

ESSE-EFFE
16-03-2013, 14:24
Originariamente inviato da matti96
Dovrebbe stampare un carattere con un determinato colore di sfondo (del dos essendo in console) e di un colore per il carattere...
Ma sotto DOS o in modalità CONSOLE sotto Windows? Sono due cose diverse. Nel secondo caso ti basta una chiamata alla SetConsoleTextAttribute (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047).

matti96
16-03-2013, 14:35
No no, niente api, deve essere multi-platform... Infatti non credo che l'asm vada bene

MItaly
16-03-2013, 14:47
Originariamente inviato da matti96
Le istruzioni sono dell'8086, lavoro su win7 a 32 bit e quelle istruzioni sul debug.exe mi funzionano...
In debug.exe se non ricordo male crei eseguibili com che vengono eseguiti da NTVDM, ovvero un layer di compatibilità per programmi per DOS. Come ti è stato detto, se vuoi scrivere un'applicazione console per Windows le API da usare sono quelle che ti sono state suggerite - dato che appunto, quelle chiamate alle routine del BIOS era roba che si poteva usare in DOS in modalità reale.

No no, niente api, deve essere multi-platform... Infatti non credo che l'asm vada bene
Lo standard C non definisce nulla per colorare l'output, o usi le API specifiche della piattaforma (API di console su Windows, sequenze di escape VT100 su sistemi UNIX-like, eventualmente wrappate dietro funzioni "agnostiche"), oppure ti affidi ad una libreria portabile che astragga questi problemi (un classico sono le varie ncurses/pdcurses, anche se offrono molto più di quanto non ti serva).

oregon
16-03-2013, 14:54
Chiarisci un po' le cose ...

Perché scrivi codice in assembly? Per un esercizio scolastico? Per tentare di fare funzionare comunque il codice (Win/Linux) ?

matti96
19-03-2013, 00:03
Sto scrivendo una libreria portatile e vorrei mettere cprintf e non è un problema ma mi serve fare cputc quindi devo gestire tutto io,quindi credo che devo scrivere a basso livello...

MItaly
19-03-2013, 17:13
Il punto è che il "basso livello" delle chiamate BIOS non è supportato dai sistemi operativi attuali, dato che le "console software" non sono gestite dal BIOS (e comunque non è consentito a programmi in usermode di fare chiamate BIOS). Devi usare API specifiche di piattaforma, implementando una funzione per impostare colore di primo piano e sfondo in modo diverso a seconda del sistema operativo su cui compili (basta qualche #ifdef).

Loading