Repository 32bit  Forum
Repository 64bit  Wiki

Costanti C inline Assembly

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Costanti C inline Assembly

Messaggioda Slack_Eater » lun ott 25, 2010 21:45

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
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Costanti C inline Assembly

Messaggioda phobos3576 » lun ott 25, 2010 22:14

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).
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: Costanti C inline Assembly

Messaggioda Slack_Eater » lun ott 25, 2010 23:05

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
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Costanti C inline Assembly

Messaggioda phobos3576 » lun ott 25, 2010 23:23

A quanto pare, la sintassi da usare è un po complicata:

http://wiibrew.org/wiki/Inline_Assembler
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: Costanti C inline Assembly

Messaggioda Slack_Eater » mar ott 26, 2010 10:59

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.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Costanti C inline Assembly

Messaggioda robbybby » mar ott 26, 2010 12:11

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
Avatar utente
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1174
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: Costanti C inline Assembly

Messaggioda phobos3576 » mar ott 26, 2010 15:09

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.
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron