Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 有没有办法让这个片段更有效?_Performance_Assembly_Masm - Fatal编程技术网

Performance 有没有办法让这个片段更有效?

Performance 有没有办法让这个片段更有效?,performance,assembly,masm,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 \m

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

使用MessageBox显示结果时,我认为效率或性能与此无关。我对你的控制流程有疑问。“RET”打算回到哪里?什么时候调用ExitProcess(如果有的话)?我不知道“end lp”是做什么的,所以也许我错过了什么

最好的,
Frank

通过这种方式,您可以从代码中删除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

定义效率::-)我看到的机器指令不到10条,所以没有太多需要删减的地方,是不是?我说的高效是指我应该格式化代码,还是应该使用任何更好的方法来实现相同的结果,例如,更小的代码->相同的结果