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