2011-08-07 2 views
0

좋아, 필자는 PC 어셈블러를 처음 사용합니다. I "는 프로그램을 작성하기 위해 노력하고있어,하지만 반복. 나는이? 감사를 해결할 수있는 방법?를 ECX 레지스터가 수정되고 같은데요 멈추지 않을 것입니다. 대부분의 x86에서끝이없는 루프 (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

어셈블러 프로그래머는 레지스터에 관심있는 값을 가져 왔고 서브 루틴 호출이이를 파괴하지 않도록주의해야합니다 (레지스터는 매우 중요하며 서브 루틴 그들 중 일부는 사용해야합니다). 이를 수행하는 한 가지 방법은 STDCALL 규칙에 따라 서브 루틴을 사용하고 ECX가 중요하다면 레지스터 관리 (예 : STDCALL)에 대한 규칙이 있다는 것입니다 (예 : 서브 루틴을 통해 ECX를 저장해야 함) 요구). –

+0

... 서브 루틴 호출에 걸쳐 레지스터를 저장하는 일반적인 방법은 스택에 밀어 넣는 것입니다 (서브 루틴에 관심이없는 스택에 따라 달라지며, 그렇게되면 다른 트릭이 필요합니다). 일반적인 구성표는 OP 코드 REG == ECX에서 PUSH REG \ CALL SUBR \ POP REG입니다. –