将 x86-64 代码转换为 Y86-64 代码

标签 c assembly x86-64 y86

当我试图辨别汇编语言时,我现在非常困惑。 我被要求将以下 x86-84 代码转换为 Y86-84:

long arith(long int x, long int y, long int z) {

return (x+y+z) & (x+4+48*y);

}

在 x86-64 中:

arith:
leaq (%rsi, %rsi, 2), %rax
salq $4, %rax
leaq 4(%rdi, %rax), %rax
addq %rdi, %rsi
addq %rdx, %rsi
andq %rsi, %rax
ret

在转换之前,我很难理解 x86-64 中到底发生了什么。我将非常感谢任何能够引导我完成这段代码中发生的事情的人。

最佳答案

这是我的第一个镜头: 在 Y86 中:

arith:
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rax
addq %rsi, %rsi
addq %rsi, %rax
addq %rdi, %rax
addq 4, %rax
addq %rdi, %rsi
addq %rdx, %rsi
addq %rsi, %rax
ret

我认为“addq 4, ​​%rax”行不正确。我应该如何将 4 添加到 %rax 寄存器中存储的值?

编辑:我发现一个更大的问题,在添加到 %rsi 后,我无法像使用 x86 那样将 x+y+z 无缝地添加到 %rsi 中。那么如何将 x+y+z 存储到寄存器中呢?

关于将 x86-64 代码转换为 Y86-64 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47066554/

相关文章:

c - 如何在 C 或 Assembly 中修改 Stack 上的返回地址

memory - gdb 'x' 命令有什么作用?

assembly - 为什么只有一半的堆栈金丝雀被清除?

c - 警告 : passing argument 2 of ‘inet_aton’ from incompatible pointer type. .......错误

c++ - Windows 上的 Objective C

c - 与对 C 程序的系统调用相比,perl 删除非 ascii 字符太慢

c - 如何在编译时获取初始化列表中的元素总数?

delphi - Delphi中的快速Swap64函数

c++ - 特殊错误 - 参数尚不存在,直到参数名称更改然后它更有利地中断

ios - 在 iOS 设备和 iOS 模拟器上运行的 .a 应该是什么架构