2016-05-14 13 views
0

配列Aを配列Bにコピーしようとしています。 ここに私のcppファイルがあります。nasm 64、segmentation fault

#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; 
} 

、ここで、ここでコピー機能の実装

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      

と私のasmファイルは、私はそれをコンパイルする方法です。残念ながら、それは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

64bit ==ポインタは8バイトです:なぜebp + 8/12/16が4つ離れていますか?そして、どのような呼び出し規約が最初の3つの引数をスタック経由で渡しますか? – ABuckau

答えて

3

パラメータがスタックに渡されたと仮定しているようです。 x64用の共通呼び出し規約は、最初のいくつかのパラメーターに登録します。 Why does Windows64 use a different calling convention from all other OSes on x86-64?を参照してください。 (または呼び出しのために生成されたアセンブリを見て、パラメータがどのように渡されるかを確認してください)

+0

ありがとう、それは私のせいでした。最初に私は32ビット用のプログラムを書いた後、それを64に変換しようとしました。 –

関連する問題