Имам тази функция в C:
int write(int fd, char *buffer, int size)
{
int ret;
__asm__("mov $4, %%eax;"
"mov %0, %%ebx;"
"mov %1, %%ecx;"
"mov %2, %%edx;"
"int $0x80"
: "=r"(ret)
: "g"(fd), "g"(buffer), "g"(size)
: "eax", "ebx", "ecx", "edx");
if (ret < 0) {
return -1;
} else {
return 0;
}
}
Което се превежда като този код в ASM:
push %ebp
mov %esp,%ebp
push %esi
push %ebx
mov $0x4,%eax
mov %esi,%ebx
mov 0x8(%ebp),%ecx
mov 0xc(%ebp),%edx
int $0x80
mov %esi,%eax
sar $0x1f,%eax
pop %ebx
pop %esi
pop %ebp
ret
Тъй като fd, *buffer и size са функционални параметри, те са съответно в 0x8(%ebp), 0xc(%ebp) и 0x10(%ebp). Защо GCC идентифицира позицията на fd в %esi, а другите две променливи се изместват в стека? Как мога да накарам тази функция да работи (да получа правилно променливите в регистрите)?