首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >compute -2xy - 3z与MSVC内联组件

compute -2xy - 3z与MSVC内联组件
EN

Stack Overflow用户
提问于 2017-10-13 01:42:03
回答 1查看 113关注 0票数 0

你们能告诉我我哪里搞错了吗?

我需要在inline-assembly -2xy - 3z中进行计算。

代码语言:javascript
复制
int solution(int x, int y, int z)
{ 
    x=4;
    y=5;
    z=2;
    int result;
    __asm
    {   
       mov eax, -2 
       imul [x]
       imul [y]
       mov ebx, eax 
       mov eax, -3
       imul [z]
       sub eax, ebx 


        mov [result], eax       ; 
    }
       assert(result == -2*x*y – 3*z);
       printf("solution_for_grade_6(%d, %d,**strong text** %d) = %d\n", x, y, z, result);
 return result;
EN

回答 1

Stack Overflow用户

发布于 2017-10-17 03:42:33

这是我的第五个解决方案(返回32位值;我删除了第四个和第三个错误/未优化的解决方案);它只使用一个IMUL;请注意,abs(X) && abs(Y)它们不能> (1<<14)-1,abs(Z)必须是< (1<<29):

代码语言:javascript
复制
__asm
{
 /*  INPUT: EAX= X               */
 /*         EDX= Y               */
 /*         EBX= Z               */
 /*   TEMP: EDX                  */
 /* OUTPUT: EAX= -2*xy-3*z)      */

 NEG   EAX

 IMUL  EDX            /* EDX:EAX=-x*y */

 ADD   EAX,EAX        /* EAX=-2*x*y */

 LEA   EDX,[EBX+EBX]
 ADD   EDX,EBX
 SUB   EAX,EDX       /* EAX=-2*x*y-z*3 */

 MOV   [RESULT],EAX
}

这是我的第二个解决方案(返回64位值);它只使用一个IMUL;现在已经优化了。请注意,abs(X) && abs(Y)它们不能大于(1<<30)-1。在本例中,我假设结果是一个64位整数:

代码语言:javascript
复制
__asm
{
 /*  INPUT: EAX= X               */
 /*         EDX= Y               */
 /*         EBX= Z               */
 /*   TEMP: ESI, EDI             */
 /* OUTPUT: EDX:EAX= -(2*xy+3*z) */

 IMUL  EDX

 ADD   EAX,EAX
 ADC   EDX,EDX /* EDX:EAX=2*xy */

 MOV   ESI,EBX
 ADD   ESI,ESI
 SBB   EDI,EDI /* EDI:ESI=2*z */

 ADD   ESI,EBX
 ADC   EDI,EDI /* EDI:ESI=3*z */

 ADD   EAX,ESI
 ADC   EDX,EDI /* EDX:EAX=2*xy+z*3 */

 NOT   EAX
 NOT   EDX

 ADD   EAX,1
 ADC   EDX,0   /* EDX:EAX=-(2*xy+z*3) */

 LEA   ESI,[RESULT]
 MOV   [ESI],EAX
 MOV   [ESI+4],EDX
}

但请记住,两个产品中的每一个都有超过64位的结果;在汇编中(返回96位值):

代码语言:javascript
复制
 ; -2xy-3z=-(2*xy+3*z)

 ; INPUT: EAX= X
 ;        EDX= Y
 ;        ECX= Z

 ; TEMP: EDI, ESI, EBP

 ; OUTPUT: EBX:EDX:EAX= -(2*xy+3*z)

 IMUL  EDX

 ADD   EAX,EAX
 RCL   EDX,1
 SBB   EBX,EBX ;EBX:EDX:EAX=2*xy

 MOV   ESI,ECX
 ADD   ESI,ESI
 SBB   EDI,EDI 
 MOV   EBP,EDI ;EBP:EDI:ESI=z*2

 ADD   ESI,ECX
 ADC   EDI,EDI
 ADC   EBP,EBP ;EBP:EDI:ESI=z*3

 ADD   EAX,ESI
 ADC   EDX,EDI
 ADC   EBX,EBP ;EBX:EDX:EAX=2*xy+z*3

 NOT   EAX
 NOT   EDX
 NOT   EBX

 ADD   EAX,1
 ADC   EDX,0
 ADC   EBX,0   ;EBX:EDX:EAX=-(2*xy+z*3)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46715800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档