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
어셈블러 프로그래머는 레지스터에 관심있는 값을 가져 왔고 서브 루틴 호출이이를 파괴하지 않도록주의해야합니다 (레지스터는 매우 중요하며 서브 루틴 그들 중 일부는 사용해야합니다). 이를 수행하는 한 가지 방법은 STDCALL 규칙에 따라 서브 루틴을 사용하고 ECX가 중요하다면 레지스터 관리 (예 : STDCALL)에 대한 규칙이 있다는 것입니다 (예 : 서브 루틴을 통해 ECX를 저장해야 함) 요구). –
... 서브 루틴 호출에 걸쳐 레지스터를 저장하는 일반적인 방법은 스택에 밀어 넣는 것입니다 (서브 루틴에 관심이없는 스택에 따라 달라지며, 그렇게되면 다른 트릭이 필요합니다). 일반적인 구성표는 OP 코드 REG == ECX에서 PUSH REG \ CALL SUBR \ POP REG입니다. –