为什么当我为注册人命名时,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;
}

我的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为ARM构建libmfx时如何解决“asm中不可能约束”的问题?

来自分类Dev

为什么TypeScript有时有时只将不可能的交集视为“从不”?

来自分类Dev

编译时在asm中不可能的约束

来自分类Dev

为什么在实例化具有具体类型的对象时不可能对变量使用泛型类型?

来自分类Dev

为什么当我将它设置为 0 时我仍然有右边距?

来自分类Dev

为什么当我重载数组运算符时我的私有变量为零?

来自分类Dev

为什么当我将 UIStackView 分布设置为等间距时子视图不可见?

来自分类Java

为什么我不可能写入到一个文件?

来自分类Dev

Gcc内联汇编“'asm'操作数具有不可能的约束”是什么意思?

来自分类Dev

当我尝试在Android NDK中加载冻结模型时,为什么没有注册任何操作?

来自分类Dev

为什么不可能有指向返回引用的指针?

来自分类Dev

为什么不可能显式地默认具有volatile参数的副本构造函数?

来自分类Dev

当我有3.7时为“请升级python”,而当我有20.0.2时为“请升级pip”。为什么会出现此错误?

来自分类Dev

当我没有变量或任何其他命名的变量时,为什么会出现错误“与 'operator==' 不匹配”?

来自分类Dev

为什么我没有注册为客户?

来自分类Dev

Nullable <int?>是不可能的,为什么不能呢?

来自分类Dev

为什么在C中不可能重载?

来自分类Dev

为什么在Haskell中不可能分割整数?

来自分类Javascript

为什么不可能从原型更改构造函数?

来自分类Dev

为什么阶乘1000年不可能的BigInteger?

来自分类Dev

volatile struct = struct不可能,为什么?

来自分类Dev

为什么本文中的这个问题是不可能的?

来自分类Dev

为什么不可能用焦点影响子元素?

来自分类Dev

不可能删除注册表项

来自分类Dev

为什么Windows会报告当我尝试复制存储在NAS上的文件可能有害时?

来自分类Dev

当我为所有状态设置背景图像时,为什么UISegmentControl段在iOS 8中突出显示?

来自分类Dev

当我的软件包为Python 3.6时,conda为什么要将所有内容降级到Python 2.7?

来自分类Dev

为什么当我只点击一个链接时,所有链接都显示为已访问?

来自分类Dev

当我将LinearLayout限制在父级的底部时,为什么它显示在顶部?

Related 相关文章

  1. 1

    为ARM构建libmfx时如何解决“asm中不可能约束”的问题?

  2. 2

    为什么TypeScript有时有时只将不可能的交集视为“从不”?

  3. 3

    编译时在asm中不可能的约束

  4. 4

    为什么在实例化具有具体类型的对象时不可能对变量使用泛型类型?

  5. 5

    为什么当我将它设置为 0 时我仍然有右边距?

  6. 6

    为什么当我重载数组运算符时我的私有变量为零?

  7. 7

    为什么当我将 UIStackView 分布设置为等间距时子视图不可见?

  8. 8

    为什么我不可能写入到一个文件?

  9. 9

    Gcc内联汇编“'asm'操作数具有不可能的约束”是什么意思?

  10. 10

    当我尝试在Android NDK中加载冻结模型时,为什么没有注册任何操作?

  11. 11

    为什么不可能有指向返回引用的指针?

  12. 12

    为什么不可能显式地默认具有volatile参数的副本构造函数?

  13. 13

    当我有3.7时为“请升级python”,而当我有20.0.2时为“请升级pip”。为什么会出现此错误?

  14. 14

    当我没有变量或任何其他命名的变量时,为什么会出现错误“与 'operator==' 不匹配”?

  15. 15

    为什么我没有注册为客户?

  16. 16

    Nullable <int?>是不可能的,为什么不能呢?

  17. 17

    为什么在C中不可能重载?

  18. 18

    为什么在Haskell中不可能分割整数?

  19. 19

    为什么不可能从原型更改构造函数?

  20. 20

    为什么阶乘1000年不可能的BigInteger?

  21. 21

    volatile struct = struct不可能,为什么?

  22. 22

    为什么本文中的这个问题是不可能的?

  23. 23

    为什么不可能用焦点影响子元素?

  24. 24

    不可能删除注册表项

  25. 25

    为什么Windows会报告当我尝试复制存储在NAS上的文件可能有害时?

  26. 26

    当我为所有状态设置背景图像时,为什么UISegmentControl段在iOS 8中突出显示?

  27. 27

    当我的软件包为Python 3.6时,conda为什么要将所有内容降级到Python 2.7?

  28. 28

    为什么当我只点击一个链接时,所有链接都显示为已访问?

  29. 29

    当我将LinearLayout限制在父级的底部时,为什么它显示在顶部?

热门标签

归档