nasm 64,分段错误

时间:2016-05-14 16:36:25

标签: c++ segmentation-fault nasm

我正在尝试将数组A复制到数组B. 这是我的cpp文件。

#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我得到了分段错误。我做错了什么?

1 个答案:

答案 0 :(得分:3)

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