按注册顺序将汇编转换为C问题

问题描述

我正在完成将程序集转换为C的任务。 这是汇编代码

mystery function:
    subq %rdx,%rsi
    imulq %rsi,%rdi
    movq %rsi,%rax
    salq $63,%rax
    sarq $63,%rax
    xorq %rdi,%rax
    ret 

假设参数x,y,z出现在寄存器%rdi,%rsi和%rdx中。 应用C函数产生以上汇编代码

这是我到目前为止的工作:

long mystery_function(long x,long y,long z){
    // x,y and z appear in register %rdi,%rsi and $rdx
    long ret;

    // subq %rdx %rsi
    // Subtract source from destination
    y = y - z;

    // imulq %rsi %rdi
    // Multiply destination by source
    x = x * y;

    // movq %rsi %rax
    // Move source to destination
    ret = y;

    // salq $63 %rax
    // Left shift destination by ​63 bits
    ret = ret << 63;

    // sarq $63 %rax
    // Right shift destination by ​k​ bits
    ret = ret >>63;

    // xorq %rdi %rax
    // Bitwise XOR destination by source
    ret = ret ^ x;
    return ret;
}

我使用此工具来检查我的代码是否可以通过使用此工具来生成汇编代码Godbolt

使用gcc版本4.6.4时,它会给我以下结果:

mystery_function:
        sub     rsi,rdx
        imul    rdi,rsi
        mov     rax,rsi
        sal     rax,63
        sar     rax,63
        xor     rax,rdi
        ret

它与所需的程序集基本相同,但是寄存器的顺序完全相反。这怎么可能呢?我认为,如果更改寄存器的顺序,操作将被更改。有什么方法可以解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)