【问题标题】:Copy content of C variable into a register (GCC)将 C 变量的内容复制到寄存器 (GCC)
【发布时间】:2013-01-24 05:51:48
【问题描述】:

由于我对 GCC 非常陌生,因此我面临内联汇编代码的问题。问题是我无法弄清楚如何将 C 变量(类型为 UINT32)的内容复制到寄存器 eax 中。我试过下面的代码:

__asm__
(
    // If the LSB of src is a 0, use ~src.  Otherwise, use src.
    "mov     $src1, %eax;"
    "and     $1,%eax;"
    "dec     %eax;"
    "xor     $src2,%eax;"

    // Find the number of zeros before the most significant one.
    "mov     $0x3F,%ecx;"
    "bsr     %eax, %eax;"
    "cmove   %ecx, %eax;"
    "xor     $0x1F,%eax;"
);

但是mov $src1, %eax; 不起作用。

有人可以提出解决方案吗?

【问题讨论】:

    标签: c linux gcc assembly x86


    【解决方案1】:

    我猜你要找的是extended assembly 例如:

        int a=10, b;
        asm ("movl %1, %%eax;   /* eax = a */
              movl %%eax, %0;" /* b = eax */
             :"=r"(b)         /* output */
             :"r"(a)         /* input */
             :"%eax"        /* clobbered register */
             );        
    

    在上面的示例中,我们使用汇编指令和eax 寄存器使b 的值等于a 的值:

    int a = 10, b;
    b = a;
    

    请查看内联 cmets。

    注意:

    mov $4, %eax          // AT&T notation
    
    mov eax, 4            // Intel notation
    

    关于 GCC 环境中的 inline assembly 的好读物。

    【讨论】:

    • 那么这是否意味着你将eax的内容复制到了b是吗??
    • 这个例子向您展示了如何通过使用 c 变量从寄存器复制到寄存器...
    • 你能指定它复制到寄存器的哪一行吗?因为这是我的主要要求...
    • 我已经处理好了源和目标。我的问题是将变量 src1 的内容复制到上面代码中给出的注册 eax 中。所以请描述如何做同样的事情。
    • 一般来说,你真的应该使用约束来指示编译器在必要时将操作数放入特定的寄存器中。对于eax,您可以使用"a"
    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多