2

好吧,我已经阅读了与我类似的问题,但我还没有能够解决这个问题。我也检查了这个,这显然可以解决我的问题。但它没有。

我正在处理的文件中有一个 C 函数:

void copiarMuestreo(unsigned short * source, int * sPos, unsigned short * destination, int * dPos, int bitsPerSample ) {...}

它的所有内部操作都在 C 中完成。source是指向向量的指针,destination也是如此。

我正在尝试从内联汇编代码中调用此函数(我将把整个函数放在这里):

void unirArchivosWAVE( unsigned short *parte1, unsigned short *parte2, unsigned short *salida, int bitsPorMuestreo ){
int posParte1;                                                                                                  //Posicion en la que lee la primera muestra
int posParte2;                                                                                                  //Posicion en la que lee la segunda muestra
int posSalida;                                                                                                  //Posicion en la que escribe las muestras
int i = pistaEntrada1.numSamples;

__asm {
    push eax
    push ebx
    push ecx
    push edx
    push edi
    mov edi, i
    mov i, 0
    mov posParte1, 0
    mov posParte2, 0
    mov salida, 0
    forGrande:
      cmp i, edi
      jge finForGrande

      lea bx, posParte1
      lea cx, posParte2
      lea dx, posSalida

      push bitsPorMuestreo
      push dx
      push salida
      push bx
      push parte1
      call copiarMuestreo
      pop parte1
      pop bx
      pop salida
      pop dx
      pop bitsPorMuestreo

      push bitsPorMuestreo
      push dx
      push salida
      push cx
      push parte2
      call copiarMuestreo
      pop parte2
      pop cx
      pop salida
      pop dx
      pop bitsPorMuestreo

      inc i
      jmp forGrande
    finForGrande:
    fin:
      pop edi
      pop edx
      pop ecx
      pop ebx
      pop eax
    }
}

我正在使用 VS2012 Express 在 Intel Core i5 中使用 Windows 8、64 位进行编程。该程序完美地崩溃了,在任何地方都没有任何错误消息,我怀疑这是一个段错误。但为什么?

起初我在调用之前推送 32 位寄存器,我认为它们是 4 个字节而不是短裤使用的 2 个字节是问题所在。不,它仍然崩溃。

我一无所知。我没有尝试过其他任何东西,因为好吧,我根本不知道该尝试什么。我是组装新手。

对不起西班牙变量名。

4

1 回答 1

2

对地址参数使用 16 位寄存器肯定是行不通的。它只会使用一半的地址,所以只要这些指针被取消引用,它们就可以在任何地方。

所有这些:

  lea bx, posParte1
  lea cx, posParte2
  lea dx, posSalida

应该:

  lea ebx, posParte1
  lea ecx, posParte2
  lea edx, posSalida

显然,push下面的操作也应该使用 32 位寄存器。

更新:

刚刚注意到别的东西。salida当假设您想设置posSalida为零时,您将参数设置为 NULL。这一行:

mov salida, 0

应该是:

mov posSalida, 0

更新 2:

还值得一提的是,不保证 ecx 寄存器在函数调用中被保留。因此,很有可能当您从第一次调用返回时copiarMuestreo,您设置为的地址的 ecxposParte2不再正确。

可能最好的解决方案是仅在第一次调用 ecx 之后初始化 ecx copiarMuestreo,因为直到第二次调用才需要它。

于 2013-05-12T03:18:25.987 回答