Erreur de compilation __asm__
Le
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
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

Poser une question


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.
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)
:);