配列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
で私がセグメンテーションフォールトを取得します。私は間違っているの?
64bit ==ポインタは8バイトです:なぜebp + 8/12/16が4つ離れていますか?そして、どのような呼び出し規約が最初の3つの引数をスタック経由で渡しますか? – ABuckau