nasm 64,分段错误

问题描述:

我试图复制数组A到数组B. 这是我的cpp文件。nasm 64,分段错误

#include <stdio.h> 

using namespace std; 

void copy(int * to, int * from, unsigned int n); //_Z6copyPiS_j 

int main(){ 
    int * a = new int [4]; 
    int * b = new int [4]; 
    for (int i=0;i<4;++i) 
    { 
    a[i] = i+1; 
    } 
    kopiuj(b,a,4); 
    for (int i=0;i<4;++i) 
    { 
    printf("%d - ", b[i]); 
    } 
    delete(a); 
    delete(b); 
    return 0; 
} 

,这里是与复制功能实现我的ASM文件

BITS 64 
section .text 

global _Z6kopiujPiS_j 

_Z6kopiujPiS_j:     

push rbp 
mov rbp, rsp 
cld 
mov edi, dword [rbp+8] ; destination 
mov esi, dword [rbp+12] ; source 
mov ecx, dword [rbp+16] ; size 

rep movsd; repeat ecx times 


mov rsp, rbp 
pop rbp 
ret      

这里是我如何编译它。不幸的是它必须是64位。(练习要求)

// nasm -felf64 82.asm -o 82.o 
// g++ -m64 -o 82m.o -c 82m.cpp 
// g++ -m64 82m.o 82.o -o 82 

,并在rep movsd我得到段错误。我做错了什么?

+0

64位==指针是8个字节:为什么ebp + 8/12/16..those是4分开的?什么调用约定通过堆栈的前3个参数? – ABuckau

您似乎认为参数在堆栈上传递。 x64的通用调用约定为前几个参数使用寄存器。请参阅Why does Windows64 use a different calling convention from all other OSes on x86-64?。 (或者查看生成的程序集以查看调用参数是如何传递的。)

+0

谢谢,那是我的错。首先,我编写了32位程序,然后试图将其转换为64位,并完全忘记了惯例。 –