2013-01-20 6 views
2

어셈블리 언어를 처음 사용합니다. 그래서 작은 프로그램을 작성하기 시작했다. "*"피라미드를 인쇄하기위한 기본 루프 프로그램을 작성했습니다. 그러나 프로그램은 무한 루프로 진행됩니다. 아래 코드를 붙여 넣습니다. 누군가 도와 주실 수 있습니까? 시작 : 루프가 무한 루프로 반복됩니다.

mov ecx,2 
    invoke StdOut, addr startProg 

label_1: 

    .while ecx > 0 

    push ecx 
     pop aInt 

    .while aInt > 0 
     invoke StdOut, addr star 
     sub aInt, 1 
    .endw 

     dec ecx 
    .endw 

    ;invoke StdOut, addr newline 


    jmp out_ 
out_: 
    invoke ExitProcess, 0 

당신은 아마 매크로 혼란 조립 설명서입니다

+0

피라미드보다 조금 더 필요합니다. 여기 - http://www.dreamincode.net/forums/topic/302352-nasmwindows-lets-create-a-pyramid-of-characters/ 피라미드를 만드는 방법을 단계별로 설명합니다. – Gunner

답변

0

를 시작합니다. .while는 어셈블리 명령어가 아니며 매크로입니다. '.'으로 시작하는 모든 지시문과 동일합니다.

+0

어셈블리가 쉬웠다면 ( – Thomas

2

Invoke는 __stdcall 호출 규칙을 통해 메서드를 호출합니다. 해당 협약의 일부는 EAX, ECX 및 EDX가 해당 통화를 통해 보존되지 않는다는 것입니다. 이것이 ECX 및 EAX 레지스터가 감소하지 않고 루프를 멈추게하는 이유입니다.

+0

)이 레지스터 대신 로컬 변수를 사용하면된다. – dev

+0

나는이 무한 루프에 좌절감을 느꼈다. 머리가 튀어 라! 그리고 그 대답은 간단했다 ... Iv는 좋은 p & p 함수를 만들었다. – kbzombie

0

@SecurityMatt와 마찬가지로 의 값이 StdOut으로 수정 되었기 때문에 무한 루프에 갇히게되는 이유가 있습니다.

.while ecx > 0 
    push ecx 
    pop aInt 
    ; preserve state of `ecx` 
    push ecx 
    .while aInt > 0 
    invoke StdOut, addr star 
    sub aInt, 1 
    .endw 
    ; restore ecx 
    pop ecx 
    dec ecx 
.endw 

또한/모든 범용 레지스터 값을 나타 밀어하기 위해 pushadpopad을 사용하고 스택에서 수 :
당신은 pop 사용하여 복원 후 push를 사용하여 레지스터를 보존하고 이것을 방지 할 수 있습니다 .

; push general-purpose registers values onto stack 
pushad 
invoke StdOut, addr star 
; restore general-purpose registers 
popad 
관련 문제