2016-05-14 16 views
0

Ich versuche Array A zu Array B zu kopieren. Hier ist meine cpp-Datei.Nasm 64, Segmentierungsfehler

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

und hier ist meine asm-Datei mit Kopierfunktion Implementierung

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      

hier ist, wie ich es kompilieren. Leider hat es 64-Bit sein. (Ausübungspflicht)

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

und bei rep movsd ich Segmentation Fault. Was mache ich falsch?

+0

64bit == Zeiger sind 8 Bytes: Warum ebp + 8/12/16 ... sind das 4 getrennt? Und welche Aufrufkonvention übergibt die ersten 3 Argumente über den Stack? – ABuckau

Antwort

3

Sie scheinen davon auszugehen, dass die Parameter auf dem Stapel übergeben werden. Die üblichen Aufrufkonventionen für x64 verwenden Register für die ersten paar Parameter. Siehe Why does Windows64 use a different calling convention from all other OSes on x86-64?. (Oder sehen Sie sich die generierte Assembly für den Aufruf an, um zu sehen, wie die Parameter übergeben werden.)

+0

Danke, das war meine Schuld. Zuerst habe ich ein Programm für 32 Bit geschrieben und dann versucht, es in 64 umzuwandeln und habe die Konvention völlig vergessen. –