小编Beh*_*ken的帖子

当我命名寄存器时,为什么asm有不可能的限制?

我是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;
}
Run Code Online (Sandbox Code Playgroud)

我的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"
    );
Run Code Online (Sandbox Code Playgroud)

我可以使用第二个代码,ofc,但我需要用优化2编译它.然后%ebp将不会指向我需要的地方.我尝试使用"a","b","c"和"d"代替"r",但没有成功.有人可以帮忙吗?感谢:D

c assembly

5
推荐指数
1
解决办法
145
查看次数

标签 统计

assembly ×1

c ×1