我刚刚开始使用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
答案 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