Pagina 1 di 1
Costanti C inline Assembly
Inviato: lun 25 ott 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 25 ott 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:
o
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 26 ott 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 26 ott 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 26 ott 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 26 ott 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:
Re: Costanti C inline Assembly
Inviato: mar 26 ott 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.