Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur de compilation __asm__

2 réponses
Avatar
ZarkXe
Bonjour a tous,

Je désier coder une fonction qui fait un appelle système en asm avec du
c. Mais lors de la compilation, j'obtiens l'erreur suivant les deux cas :

/tmp/ccIpc6qu.o: In function `zwrite':
test.c:(.text+0x1c): undefined reference to `fd'
test.c:(.text+0x24): undefined reference to `buf'
test.c:(.text+0x2c): undefined reference to `count'
collect2: ld returned 1 exit status

Cas 1 :
int zwrite(int fd, const void *buf, short int count) {
__asm__("movq $1, %rax");
__asm__("movq %k, %rdi"::[k] "m" (fd));
__asm__("movq buf, %rsi");
__asm__("movq count, %rdx");
__asm__("syscall");
return 0;
}

Cas 2 :
#define zwrite(_fd,_buf,_count) \
__asm__("movq $1, %rax"); \
__asm__("movq _fd, %rdi"); \
__asm__("movq _buf, %rsi"); \
__asm__("movq _count, %rdx"); \
__asm__("syscall");

Comment doit-je faire le passage de paramètre ?

Merci pour vos réponse.

ZarkXe

2 réponses

Avatar
Antoine Leca
ZarkXe écrivit :
Je désier coder une fonction qui fait un appelle système en asm avec du
c. Mais lors de la compilation, j'obtiens l'erreur suivant les deux cas :

/tmp/ccIpc6qu.o: In function `zwrite':
test.c:(.text+0x1c): undefined reference to `fd'
test.c:(.text+0x24): undefined reference to `buf'
test.c:(.text+0x2c): undefined reference to `count'

Cas 1 :
int zwrite(int fd, const void *buf, short int count) {
__asm__("movq $1, %rax");
__asm__("movq %k, %rdi"::[k] "m" (fd));



fd, buf et count sont des raccourcis désignant (en fonction de l'ABI que
tu utilises) des registres (de mémoire, RCX, RDX, RSI, RDI ou R8). Je
pense donc que la contrainte à utiliser est "r" plutôt que "m".
"g" peut peut-être remplacer les deux avec profit.


__asm__("movq buf, %rsi");
__asm__("movq count, %rdx");



Là (et idem pour la macro), je crois que tu anticipes un peu sur les
capacités de GCC...


Antoine
Avatar
ZarkXe
Le 24/10/2011 10:51, Antoine Leca a écrit :
ZarkXe écrivit :
Je désier coder une fonction qui fait un appelle système en asm avec du
c. Mais lors de la compilation, j'obtiens l'erreur suivant les deux cas :

/tmp/ccIpc6qu.o: In function `zwrite':
test.c:(.text+0x1c): undefined reference to `fd'
test.c:(.text+0x24): undefined reference to `buf'
test.c:(.text+0x2c): undefined reference to `count'



Cas 1 :
int zwrite(int fd, const void *buf, short int count) {
__asm__("movq $1, %rax");
__asm__("movq %k, %rdi"::[k] "m" (fd));



fd, buf et count sont des raccourcis désignant (en fonction de l'ABI que
tu utilises) des registres (de mémoire, RCX, RDX, RSI, RDI ou R8). Je
pense donc que la contrainte à utiliser est "r" plutôt que "m".
"g" peut peut-être remplacer les deux avec profit.


__asm__("movq buf, %rsi");
__asm__("movq count, %rdx");



Là (et idem pour la macro), je crois que tu anticipes un peu sur les
capacités de GCC...


Antoine


Super merci.

A force de tâtonnement je suis arriver a ceci. Est-t-il possible de
améliorais ?

#define zwrite(_ARG0, _ARG1, _ARG2)
zsyscall3(__NR_write, _ARG0, *_ARG1, _ARG2)

#define zsyscall3(_number, _ARG0, _ARG1, _ARG2)
__asm__ __volatile__("movl %3, %%edx;"
"movq %2, %%rsi;"
"movq %1, %%rdi;"
"movq %0, %%rax;"
"syscall;"
: /* pas de sortie */
:"g" (_number), "g" (_ARG0), "g" (_ARG1), "g" (_ARG2)
:);