[英]Why asm have impossible constraints when I name registers?
我是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
請注意,由於使用約束而不是名稱寄存器,編譯器能夠進一步優化代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.