簡體   English   中英

當我命名寄存器時,為什么asm有不可能的限制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM