问题描述
我正在完成将程序集转换为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 (将#修改为@)