假设您在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
答案 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