C内联汇编帮助(数字C编译器)
最后一次编辑时划伤。。。它仍然不工作,而且地址偏移量仍然以字节为单位,据我所知>\up>不知道代码为什么不工作。看起来还可以,但我的成绩也不好。 这是一条很长的路,但对我来说很有效: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
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
}