[英]converting assembly code to x86_64
我需要将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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.