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

この方法で、コードを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
于 2012-08-01T00:39:52.807 に答える
0

結果を MessageBox で表示するとき、効率やパフォーマンスが関係しているとは思えません。制御フローについて質問があります。「RET」はどこに戻るつもりですか?ExitProcess が呼び出されるのはいつですか? 「end lp」が何をするかわからないので、何かが足りないのかもしれません...

ベスト、フランク

于 2012-07-31T23:58:02.943 に答える