0
OK、私はPC Assemblerを初めて使いました。 I「Mプログラムを書き込もうとしたが、それがループ停止しません。私はECXレジスタは、呼び出し規約ほとんどのx86に感謝します。エンドレスループwith assember
DATA SECTION
;
KEEP DD 0 ;temporary place to keep things
;
CODE SECTION
;
START:
MOV ECX,12
TOPOFLOOP:
PUSH -11 ;STD_OUTPUT_HANDLE
CALL GetStdHandle ;get, in eax, handle to active screen buffer
PUSH 0,ADDR KEEP ;KEEP receives output from API
PUSH 5,'bruce' ;5=length of string
PUSH EAX ;handle to active screen buffer
CALL WriteFile
XOR EAX,EAX ;return eax=0 as preferred by Windows
LOOP TOPOFLOOP
ENDLABEL:
RET
それが本当であるかどうかに関わらず、アセンブラプログラマとしては、関心のある値をレジスタに取得したこと、サブルーチン呼び出しがそれらを破壊しないこと(レジスタは貴重であること、およびサブルーチンそれらのいくつかを使う必要があります)。これを行う1つの方法は、あなたが何をしなければならないかを示唆するレジスタ管理(例えば、STDCALL)に関する規則を持っていることです(例えば、STDCALL規則に従ってサブルーチンを使用し、ECXが重要な場合、サブルーチンコール)。 –
...サブルーチンコールを介してレジスタを保存する一般的な方法は、スタックにプッシュすることです(これは、サブルーチンに関係のないスタックに依存します;もしそうであれば別のトリックが必要です)。通常のスキームはOPコードREG == ECXのPUSH REG \ CALL SUBR \ POP REGです。 –