【发布时间】: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 个字节吗?