0

我刚开始玩 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
4

2 回答 2

0

使用 MessageBox 显示结果时,我认为效率或性能无关紧要。我对您的控制流有疑问。“RET”打算返回哪里?如果有的话,什么时候调用 ExitProcess?我不知道“end lp”做了什么,所以也许我错过了一些东西......

最好的,弗兰克

于 2012-07-31T23:58:02.943 回答
0

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

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

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
于 2012-08-01T00:39:52.807 回答