2014-05-13 13 views
0

i386 어셈블 파일을 x86_64로 이식하는 데 도움이 필요합니다. 어셈블리 코드를 처음 접하는 사용자는이 노력에 도움이 필요합니다.어셈블리 코드를 x86_64로 변환

그래서 여기에 이전 어셈블리 파일이 있습니다. 그리고 그 아래에 내 포팅 된 버전이 있습니다 (모두 내가 변경 한 레지스터 유형이었습니다). x86_64 Arch에서 실행할 때 분할 오류가 발생합니다. 왜 그런가? 이것을 포팅하는 동안 내가 빠뜨린 것. 이 기능은 메인 호출과 값은이에 전달된다

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 
+1

메모리 위치는 32 비트 간격으로 4 비트 떨어져있는 것처럼 보입니다. 그들은 8 바이트 떨어져 있어야하지 않습니까? – user3386109

답변

1

레지스터는 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 
+0

C 또는 일부 다른 외부 구성 요소에서 호출하는 경우 호출 규칙이 다릅니다. – Jester

+0

오프셋의 변화와 함께 나는 아직도 세그멘테이션 결함을 얻는다. 어셈블리 파일과 관련된 세분화 오류를 검사하는 방법은 무엇입니까? gdb의 "bt"는 여기서 도움이되지 않습니다. –