2011-08-07 75 views
0

好的,我是PC彙編程序的新手。我「米試圖寫一個程序,但它不會停止循環。我猜ECX寄存器被修改?我怎樣才能解決這個問題?謝謝。無盡循環與設置

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

在大多數x86調用約定,包括Windows API函數使用的約定是stdcall,ECX是一個調用者保存寄存器 - 調用函數不需要確保寄存器的值在返回時與調用時相同,必須將其保存在某處在你自己的代碼中是安全的

+1

無論是否爲真,作爲彙編程序員,你必須注意獲取感興趣的值到寄存器中,子程序調用不會破壞它們(寄存器是珍貴的,子程序也需要使用其中的一些)。一種方法是使用註冊表管理(例如STDCALL),它提示你必須做什麼(例如,如果你遵循STDCALL慣例使用子程序,並且ECX對你很重要,你需要將它保存在子程序中呼叫)。 –

+0

...通過子程序調用保存寄存器的常用方法是將其推入堆棧(這取決於堆棧中不包含子程序感興趣的任何內容;如果存在,則需要另一個技巧)。通常的方案是PUSH REG \ CALL SUBR \ POP REG,在OP代碼REG == ECX中。 –