Pagina 1 di 1

Costanti C inline Assembly

Inviato: lun ott 25, 2010 22:45
da Slack_Eater
Ciao, ho un altra domanda riguardo all'utilizzo di costanti all'interno di codice assembly.

Ho questo esempio

Codice: Seleziona tutto

#include <stdio.h>
#define TEST 1

int main(void){

asm(".intel_syntax noprefix");
asm("mov al, TEST");
asm(".att_syntax prefix");

}



Al momento di compilarlo ottengo:

Codice: Seleziona tutto

bash-4.1# gcc prova.c
/tmp/cceahXuH.o: In function `main':
prova.c:(.text+0x4): undefined reference to `TEST'
collect2: ld returned 1 exit status


Come faccio ad usare la costante nell'assembly?? Devo precederla con dei caratteri speciali?

Grazieee

Re: Costanti C inline Assembly

Inviato: lun ott 25, 2010 23:14
da phobos3576
La costante definita in quel modo viene creata nel blocco dati globale, puntato dal registro DS; la sintassi corretta dovrebbe essere quindi:

Codice: Seleziona tutto

asm("mov al, ds:TEST");

o

Codice: Seleziona tutto

asm("mov al, ds:[TEST]");

Attento comunque che TEST è una parola chiave dell'assembly (comparazione logica con AND senza modifica dell'operando destinazione).

Re: Costanti C inline Assembly

Inviato: mar ott 26, 2010 0:05
da Slack_Eater
Ho fatto così

Codice: Seleziona tutto

bash-4.1# cat test.c
#include <stdio.h>
#define NL 1

int main(void){
        asm(".intel_syntax noprefix");
        asm("mov al, ds:NL");
        asm(".att_syntax prefix");
}

e ottengo queto:

Codice: Seleziona tutto

bash-4.1# gcc test.c
/tmp/ccSnkUNU.o: In function `main':
test.c:(.text+0x4): undefined reference to `NL'
collect2: ld returned 1 exit status


Grazie

Re: Costanti C inline Assembly

Inviato: mar ott 26, 2010 0:23
da phobos3576
A quanto pare, la sintassi da usare è un po complicata:

http://wiibrew.org/wiki/Inline_Assembler

Re: Costanti C inline Assembly

Inviato: mar ott 26, 2010 11:59
da Slack_Eater
Sul link che hai postato c'è questo

Codice: Seleziona tutto

#define const_value 4
long out_value;

asm (
"li %[out_value],%[const_value]"
 :[out_value]"=r" (out_value) /* output */
 :[const_value]"i" (const_value) /* input */
);


Questo potrei usarlo con la sintassi AT&T mi pare, però avrei bisogno della stessa cosa ma con la sintassi intel.

Re: Costanti C inline Assembly

Inviato: mar ott 26, 2010 13:11
da robbybby
phobos3576 ha scritto:La costante definita in quel modo viene creata nel blocco dati globale, puntato dal registro DS


Permettimi di dissentire.
#define non alloca spazio in memoria. E' solo un'istruzione di preprocessore, che definisce un sinonimo. La sua semantica è simile a quelle delle istruzioni EQU negli assembler.
Per allocare spazio in memoria dovresti fare qualcosa del tipo:

Codice: Seleziona tutto

const int MyTest=1

Re: Costanti C inline Assembly

Inviato: mar ott 26, 2010 16:09
da phobos3576
robbybby ha scritto:
phobos3576 ha scritto:La costante definita in quel modo viene creata nel blocco dati globale, puntato dal registro DS


Permettimi di dissentire./code]

Infatti, ho scritto una c.....a!

Mi riferivo ovviamente alle costanti create con const in una locazione di memoria del blocco dati.
Le costanti create con #define sono valori immediati che poi vengono inseriti direttamente nel codice binario dal compilatore.