我是C语言程序集的新手,我不知道如何解决此错误。我正在做一个意味着要写文件的函数。我所拥有的是:
ssize_t mywrite(int fd, const void *buf, size_t count) {
// return write(fd, buf, count);
ssize_t var;
__asm__("movl $4,%%eax\n\t" // Write
"movl %1,%%ebx\n\t"
"movl %2,%%ecx\n\t"
"movl %3,%%edx\n\t"
"int $0x80\n\t" // System call
"movl %%eax,%0"
:"=r"(var)
:"r"(fd),"r"(buf),"r"(count)
:"%eax","%ebx","%ecx","%edx"
);
return var;
}
我的asm应该和write(fd,buf,count)一样;编译时,出现“'asm'操作数具有不可能的约束”。但是,如果不命名变量并直接从堆栈中获取值,则不会出错。这是代码
__asm__("movl $4,%%eax\n\t"
"movl 8(%%ebp),%%ebx\n\t"
"movl 12(%%ebp),%%ecx\n\t"
"movl 16(%%ebp),%%edx\n\t"
"int $0x80\n\t"
"movl %%eax,%0"
:"=r"(var)
:
:"%eax","%ebx","%ecx","%edx"
);
我可以使用第二个代码ofc,但是我需要使用优化2对其进行编译。然后%ebp不会指向我需要的位置。我尝试使用“ a”,“ b”,“ c”和“ d”而不是“ r”,但是没有成功。有人可以帮忙吗?感谢:D
问题是约束r
意味着寄存器,但是您的CPU根本没有那么多寄存器!
您可以使用内存约束m
:
:"m"(fd),"m"(buf),"m"(count)
这将生成如下指令:
movl 8(%ebp),%ebx
但是我建议在所有荣耀中使用x86约束:
ssize_t mywrite(int fd, const void *buf, size_t count) {
ssize_t var;
__asm__(
"int $0x80"
:"=a"(var)
:"0"(4), "b"(fd),"c"(buf),"d"(count)
);
return var;
}
那,-Ofast
给与:
push %ebx
mov $0x4,%eax
mov 0x10(%esp),%edx
mov 0xc(%esp),%ecx
mov 0x8(%esp),%ebx
int $0x80
pop %ebx
ret
和-Os
:
push %ebp
mov $0x4,%eax
mov %esp,%ebp
push %ebx
mov 0x10(%ebp),%edx
mov 0x8(%ebp),%ebx
mov 0xc(%ebp),%ecx
int $0x80
pop %ebx
pop %ebp
ret
注意,由于使用了约束而不是按名称命名的寄存器,编译器如何能够进一步优化代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句