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

Costanti C inline Assembly

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: Costanti C inline Assembly

Messaggio 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).

Avatar utente
Slack_Eater
Linux 1.x
Linux 1.x
Messaggi: 163
Iscritto il: gio 14 feb 2008, 21:29
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0
Località: Svizzera
Contatta:

Re: Costanti C inline Assembly

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: Costanti C inline Assembly

Messaggio da phobos3576 »

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

http://wiibrew.org/wiki/Inline_Assembler

Avatar utente
Slack_Eater
Linux 1.x
Linux 1.x
Messaggi: 163
Iscritto il: gio 14 feb 2008, 21:29
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0
Località: Svizzera
Contatta:

Re: Costanti C inline Assembly

Messaggio 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.

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: Costanti C inline Assembly

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: Costanti C inline Assembly

Messaggio 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.

Rispondi