Inline Assembler para função wrapper não funciona por algum motivo
Estou tentando escrever uma função wrapper para a chamada do sistema read (), usando asm volatile, mas não funcionará, já que a res não altera seu valor.
Aqui está o código:
<code>ssize_t my_read(int fd, void *buf, size_t count) { ssize_t res; __asm__ volatile( "int $0x80" /* make the request to the OS */ : "=a" (res), /* return result in eax ("a") */ "+b" (fd), /* pass arg1 in ebx ("b") */ "+c" (buf), /* pass arg2 in ecx ("c") */ "+d" (count) /* pass arg3 in edx ("d") */ : "a" (5) /* passing the system call for read to %eax , with call number 5 */ : "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */ /* The operating system will return a negative value on error; * wrappers return -1 on error and set the errno global variable */ if (-125 <= res && res < 0) { errno = -res; res = -1; } return res; } </code>
e aqui estáint main ()
:
<code> int main() { int fd = 432423; char buf[128]; size_t count = 128; my_read(fd, buf, count); return 0; } </code>
Estou fazendo algo errado ? talvez seja por causa dovolatile
?
Eu tentei depurar o código, e quando o Eclipse entra emmy_read(fd, buf, count);
e chega à linha__asm__ volatile(
emmy_read
, falha e entra emif (-125 <= res && res < 0)
...
EDITAR:
<code>ssize_t my_read(int fd, void *buf, size_t count) { ssize_t res; __asm__ volatile( "int $0x80" /* make the request to the OS */ : "=a" (res) /* return result in eax ("a") */ : "a" (5) , /* passing the system call for read to %eax , with call number 5 */ "b" (fd), /* pass arg1 in ebx ("b") */ "c" (buf), /* pass arg2 in ecx ("c") */ "d" (count) /* pass arg3 in edx ("d") */ : "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */ /* The operating system will return a negative value on error; * wrappers return -1 on error and set the errno global variable */ if (-125 <= res && res < 0) { errno = -res; res = -1; } return res; } </code>
e principal:
<code> int main() { int fd = 0; char buf[128]; size_t count = 128; my_read(fd, buf, count); return 0; } </code>