Repository 32bit  Forum
Repository 64bit  Wiki

Costanti C inline Assembly

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 22: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 22: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: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: dom apr 17, 2005 0: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 0: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 22: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 » mar ott 26, 2010 0: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: dom apr 17, 2005 0: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 11: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 22: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 13: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: 1077
Iscritto il: sab dic 16, 2006 11: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 16: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: dom apr 17, 2005 0: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 0 ospiti

cron