【问题标题】:nasm 64, segmentation faultnasm 64,分段错误
【发布时间】:2016-09-10 18:51:31
【问题描述】:

我正在尝试将数组 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 我得到分段错误。我做错了什么?

【问题讨论】:

  • 64 位 == 指针是 8 个字节:为什么 ebp+8/12/16..这些是 4 个字节?什么调用约定通过堆栈传递前 3 个参数?

标签: c++ segmentation-fault nasm


【解决方案1】:

您似乎假设参数是在堆栈上传递的。 x64 的常见调用约定将寄存器用于前几个参数。见Why does Windows64 use a different calling convention from all other OSes on x86-64?。 (或者查看生成的调用程序集,看看参数是如何传递的。)

【讨论】:

  • 谢谢,那是我的错。首先我为 32 位编写程序,然后尝试将其转换为 64,完全忘记了约定。
猜你喜欢
  • 2023-01-11
  • 2013-06-21
  • 1970-01-01
  • 2020-06-07
  • 2014-01-31
  • 2013-07-24
  • 2015-01-09
  • 2012-06-26
  • 2014-12-27
相关资源
最近更新 更多