2013-01-20 266 views
2

我是新來的彙編語言。所以開始寫小程序。我寫了一個基本的循環程序來打印「*」金字塔。但程序進入無限循環。我正在粘貼下面的代碼。有人可以幫忙嗎? 開始:while循環在masm32無限循環

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

你可能用宏混亂的彙編指令。 。時不是彙編指令,它是一個宏。 與以'。'開頭的所有指令相同。

+0

如果只有組裝很容易:( – Thomas

2

調用通過__stdcall調用約定調用該方法。該公約的一部分是EAX,ECX和EDX不會在該通話中保留。這就是爲什麼你的ECX和EAX寄存器不會遞減並導致循環停止的原因。

+0

你的意思是如果我使用本地變量,而不是這些寄存器,應該工作嗎? – dev

+0

我非常沮喪與這些無限循環我一直在得到,我是關於拉我的頭髮在我的出頭!答案就是這麼簡單...... Iv現在提供了一些很好的P&P功能,現在感謝+1 – kbzombie

0

就像@SecurityMatt所述,你被困在無限循環中的原因是因爲ecx的值在您撥打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,以推動/上彈出所有的通用寄存器的值,並從堆棧:
您可以通過使用push保護您的寄存器,然後使用pop恢復他們避免這種情況。

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