C内联汇编帮助(数字C编译器)

C内联汇编帮助(数字C编译器),c,assembly,C,Assembly,最后一次编辑时划伤。。。它仍然不工作,而且地址偏移量仍然以字节为单位,据我所知>\up>不知道代码为什么不工作。看起来还可以,但我的成绩也不好。 这是一条很长的路,但对我来说很有效: asm { mov EAX, j mov EBX, 4 mul EAX, EBX mov EBX, b add EAX, EBX mov ECX, EAX mov ESI, a mov EBX, i mov EAX, [ESI+EBX*4] mov ESI, ECX

最后一次编辑时划伤。。。它仍然不工作,而且地址偏移量仍然以字节为单位,据我所知>\up>不知道代码为什么不工作。看起来还可以,但我的成绩也不好。 这是一条很长的路,但对我来说很有效:

asm {
  mov EAX, j
  mov EBX, 4
  mul EAX, EBX
  mov EBX, b
  add EAX, EBX
  mov ECX, EAX

  mov ESI, a
  mov EBX, i
  mov EAX, [ESI+EBX*4]

  mov ESI, ECX
  mul [ESI] 
  mov lowPart, EAX
  mov highPart, EDX
  }

看起来不错。检查生成的程序集并使用调试器。更不用说使用现成的bignum库或只是在编译器中使用双宽度支持(
long
uint64\u t
或其他任何东西)。
mul[ESI+ECX*4]
是不明确的。如果您想将内存操作数解释为
dword
,您应该明确地告诉汇编程序。Michael,您完全正确。我需要输入mul dword ptr。这解决了我的问题。谢谢。@Michael,你能补充你的评论作为回答吗?它解决了OP的问题,我会投赞成票。
 void BigInteger_Mul( length, int *a, int *b, int *dest) {     
     ... do a bunch of stuff ...
     int highPart, lowPart;
     longMul( *(a+i), *(b+j), &highPart, &lowPart);
     ... do a bunch more stuff ...
}
longMul( *(a+i), *(b+j), &highPart, &lowPart);
asm {
            mov ESI, a
            mov ECX, i
            mov EAX, [ESI+ECX*4]

            mov ESI, b
            mov ECX, j
            mul [ESI+ECX*4]

            mov lowPart, EAX
            mov highPart, EDX
}
asm {
  mov EAX, j
  mov EBX, 4
  mul EAX, EBX
  mov EBX, b
  add EAX, EBX
  mov ECX, EAX

  mov ESI, a
  mov EBX, i
  mov EAX, [ESI+EBX*4]

  mov ESI, ECX
  mul [ESI] 
  mov lowPart, EAX
  mov highPart, EDX
  }