试图调试程序集文件错误

时间:2014-05-20 19:26:13

标签: assembly x86-64 porting cpu-registers i386

我正在尝试将32位汇编函数移植到64位。它的save_context和restore_restore。基本上从i386移植到x86_64

所以这是我的移植

32位版本:

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

save_context:
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

主要功能:

u_int32_t context[10]; 

if (cpu_save_context(context) == TRUE) {
   // do something
}

gdb>> p context

$2 = {<some value>, 0, 0, <some value>, 0, 0, <some value>, <some value>, 0, 0}

64位版本:

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

cpu_save_context:

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

mov     %r12, 32(%rax)      /* Save r12 */
mov     %r13, 40(%rax)      /* Save r13 (8*3+16)*/
mov     %r14, 48(%rax)      /* Save r13 */
mov     %r15, 56(%rax)      /* Save r13 */
mov     %rbp, 72(%rax)      /* Save frame pointer */
    mov     %rsp, 88(%rax)      /* Save stack pointer */

mov     8(%rbp), %r10       /* Fetch our return address */
mov     %r10,  8(%rax)      /* Save our return address */

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

ret

主要功能:

u_int64_t context[10];  // i have tried increasing 10->20 and 40//still save errors
if (cpu_save_context(context) == TRUE) {
     // do something
}

gdb&gt;&gt; p context

$2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

所以这些功能适用于32位版本,但对于64位没有这样的运气。我发布了类似的问题,他们相信我的移植汇编代码很好。 Segmentation fault in assembly code + C

有人可以帮忙调试一下。

0 个答案:

没有答案