【问题标题】:converting assembly code to x86_64将汇编代码转换为 x86_64
【发布时间】:2014-05-13 21:15:10
【问题描述】:

我需要帮助将 i386 汇编文件移植到 x86_64。汇编代码相当新,因此需要帮助。

所以这里是旧的程序集文件。下面是我的移植版本(我所做的只是更改寄存器类型)。当我在 x86_64 Arch 上运行它时出现分段错误。知道为什么吗?移植时我缺少的任何东西。这个函数是从 main 调用的,传递给它的值是

argv=0xffffd954 --> 对于 i386 argv=0x7fffffffe7b8 --> 对于 x86_64

// i386 register_swap

.align  4,0x90
.global register_swap
.type   register_swap,@function

register_swap:

   movl    4(%esp),%eax             
   movl    %ebx, 12(%eax)       
   movl %esi, 16(%eax)      
   movl %edi, 20(%eax)      
   movl %ebp, 24(%eax)      
   movl    %esp, 28(%eax)       

   movl 0(%esp), %edx       
   movl %edx,  0(%eax)      
   xorl    %eax,%eax        
   incl %eax
   ret

// x86_64 register_swap

.align  4,0x90
.global register_swap
.type   register_swap,@function

register_swap:

mov    4(%rsp),%rax     /* Get our context pointer */
                            /* Don't need to save A */
mov    %rbx, 12(%rax)       /* Save B */

mov     %rsi, 16(%rax)      /* Save SI */
mov     %rdi, 20(%rax)      /* Save DI */
mov     %rbp, 24(%rax)      /* Save frame pointer */
mov     %rsp, 28(%rax)      /* Save stack pointer */

mov     0(%rsp), %rdx       /* Fetch our return address */
mov     %rdx,  0(%rax)      /* Save our return address */

xor     %rax,%rax       /* Construct return code of 1 */
inc     %rax

ret

【问题讨论】:

  • 内存位置似乎相隔 4 个字节,即 32 位。它们不应该相隔 8 个字节吗?

标签: assembly x86-64 i386


【解决方案1】:

寄存器在 x86_64 中是两倍大:8 个字节而不是 4 个。您必须更改代码中的偏移量。

.align  4,0x90
.global register_swap
.type   register_swap,@function

register_swap:

mov    8(%rsp),%rax     /* Get our context pointer */
                            /* Don't need to save A */
mov    %rbx, 24(%rax)       /* Save B */

mov     %rsi, 32(%rax)      /* Save SI */
mov     %rdi, 40(%rax)      /* Save DI */
mov     %rbp, 48(%rax)      /* Save frame pointer */
mov     %rsp, 56(%rax)      /* Save stack pointer */

mov     0(%rsp), %rdx       /* Fetch our return address */
mov     %rdx,  0(%rax)      /* Save our return address */

xor     %rax,%rax       /* Construct return code of 1 */
inc     %rax

ret

【讨论】:

  • 更不用说调用约定也不同,以防这是从 C 或其他一些外部组件调用的。
  • 随着偏移量的变化,我仍然遇到分段错误。我如何检查与程序集文件相关的分段错误.. gdb 的“bt”在这里没有帮助
猜你喜欢
  • 2013-01-22
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2011-05-04
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多