有没有办法优化这个x86汇编代码?

时间:2015-07-08 13:19:48

标签: assembly x86

假设您在eax,ecx中获得了值。写一段代码 计算5 * eax + 3 * ecx + 1,并将结果存储在eax中。 (* 意味着乘法。)

我的代码:

;Initialize the values in eax and ecx
mov eax,3
mov ecx,4
;Compute 3*ecx
mov ebx,eax
mov eax,ecx
mov edx,3
mul edx
; Compute 5*eax
mov ecx,eax
mov eax,ebx
mov edx,5
mul edx
; Compute 5*eax + 3*ecx + 1
lea eax,[ecx + eax]
inc eax

2 个答案:

答案 0 :(得分:6)

如果通过" optimize" 表示优化指令计数,那么请确保使用lea更多:

;Initialize the values in eax and ecx
mov eax,3
mov ecx,4

;Compute 3*ecx
lea ecx,[ecx*2 + ecx]

; Compute 5*eax
lea eax,[eax*4 + eax]

; Compute 5*eax + 3*ecx + 1
lea eax,[ecx + eax + 1]

如果我的眼睛正确地为我服务,那么机器代码大小也减少了16个字节。

lea指定偏移量一节中列出了使用public class MyLogicalHandler implements LogicalHandler<LogicalMessageContext> { private final String RejectionResponseBody = "<ns2:MessageControllerResponse xmlns:ns2=\"http://some.namespace.com/\"><return>SOMEDATA</return></ns2:MessageControllerResponse>"; @Override public boolean handleMessage(LogicalMessageContext context) { return true; } @Override public boolean handleFault(LogicalMessageContext context) { processMessage(context); return true; } @Override public void close(MessageContext context) { } private void processMessage(LogicalMessageContext context) { Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundProperty) { LogicalMessage msg = context.getMessage(); msg.setPayload(new StreamSource(new ByteArrayInputStream(RejectionResponseBody.getBytes()))); } } } 计算内容的规则。

答案 1 :(得分:5)

迈克尔(最优秀的)解决方案可以稍微优化一下(缩短1个字节),但这需要先进行一点代数操作。

  5*eax + 3*ecx + 1
= 2*eax + 3*eax + 3*ecx + 1
= 2*eax + 3*(eax + ecx) + 1

这可以通过......来解决。

(Excluding initialization of EAX and ECX)
add ecx, eax                  ; 2 bytes
lea ecx,[ecx*2 + ecx]         ; 3 bytes
lea eax,[eax*2 + ecx + 1]     ; 4 bytes