我正在尝试将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
有人可以帮忙调试一下。