2011-08-07 6 views
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 

答えて

2

?私はこの問題を解決するにはどうすればよい?修正されている推測している、など、 Windows API関数で使用されるstdcallの規則ECXは呼び出し元保存レジスタです。呼び出された関数は、呼び出されたときと同じようにレジスタの値が同じであることを確認する必要はありません。

+1

それが本当であるかどうかに関わらず、アセンブラプログラマとしては、関心のある値をレジスタに取得したこと、サブルーチン呼び出しがそれらを破壊しないこと(レジスタは貴重であること、およびサブルーチンそれらのいくつかを使う必要があります)。これを行う1つの方法は、あなたが何をしなければならないかを示唆するレジスタ管理(例えば、STDCALL)に関する規則を持っていることです(例えば、STDCALL規則に従ってサブルーチンを使用し、ECXが重要な場合、サブルーチンコール)。 –

+0

...サブルーチンコールを介してレジスタを保存する一般的な方法は、スタックにプッシュすることです(これは、サブルーチンに関係のないスタックに依存します;もしそうであれば別のトリックが必要です)。通常のスキームはOPコードREG == ECXのPUSH REG \ CALL SUBR \ POP REGです。 –