Inline Assembler dla funkcji wrapper nie działa z jakiegoś powodu
Próbuję napisać funkcję wrappera dla wywołania systemowego read (), używając asm volatile, ale nie zadziała, ponieważ res nie zmienia swojej wartości.
Oto kod:
<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>
a tu jestint main ()
:
<code> int main() { int fd = 432423; char buf[128]; size_t count = 128; my_read(fd, buf, count); return 0; } </code>
Czy robię coś źle ? może to z powoduvolatile
?
Próbowałem debugować kod, a kiedy wchodzi Eclipsemy_read(fd, buf, count);
i dociera do linii__asm__ volatile(
wmy_read
, zawodzi i wchodzi wif (-125 <= res && res < 0)
...
EDYTOWAĆ :
<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>
i główne:
<code> int main() { int fd = 0; char buf[128]; size_t count = 128; my_read(fd, buf, count); return 0; } </code>