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