有什么办法让这个片段更有效率?

时间:2012-07-31 23:00:56

标签: performance assembly masm

我刚刚开始使用MASM风格的程序集,在玩了足够长的时间后设法制作了一个循环。这只是为了修补,所以我想知道是否有人可以给我任何见解和解释,如果这个代码效率低下或者如何改进它。

.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib

.data
MsgBxTitle db "Loop Step", NULL

.data?
Buff dd ?
MsgBxBody dd ?

.code
start:
XOR eax,eax
MOV Buff, eax 
lp:
invoke dw2hex, Buff, addr MsgBxBody
invoke MessageBox, NULL, addr MsgBxBody, addr MsgBxTitle, MB_OKCANCEL
.IF eax==IDCANCEL
RET
.ENDIF
INC Buff
CMP Buff,10
JL lp
RET
end lp
invoke ExitProcess, NULL
end start

2 个答案:

答案 0 :(得分:0)

使用MessageBox显示结果时,我看不到效率或性能是否相关。我对你的控制流程有疑问。 “RET”打算返回哪里?什么时候调用ExitProcess?我不知道“结束lp”是做什么的,所以也许我错过了什么......

最佳, 弗兰克

答案 1 :(得分:0)

您可以通过这种方式从代码中删除16个字节。将寄存器归零并将其推至零。使用寄存器为你的dword缓冲区。使用寄存器组装成较小的操作码并且比内存(标签)“更快”。

我个人不喜欢/使用高级别的东西。

start:
    xor     edi, edi
    xor     esi, esi
    mov     ebx, 10
lp:
    push    offset MsgBxBody
    push    edi
    call    dw2hex

    push    MB_OKCANCEL
    push    offset MsgBxTitle
    push    offset MsgBxBody
    push    esi
    call    MessageBox
    test    eax, IDCANCEL
    jnz     Done

    inc     edi
    dec     ebx
    jns     lp

Done:
    push    esi
    call    ExitProcess
end start