繁体   English   中英

将汇编代码转换为x86_64

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM