2

こんにちは、ここに投稿するのは初めてですが、次の規則に従ってアセンブリ関数 syracuse(N, sequence) を設計するという宿題に取り組んでいます。1. N が 1 の場合、ループを終了します。2. N が偶数の場合、N=N/2、ループの先頭に移動 3. N が奇数の場合、N= 3N+1、ループの先頭に移動

非常に単純なことですが、彼は、いくつかの情報を表示してレポートを作成することを望んでいます。しかし、私はこのコードを数時間見つめていて、何が悪いのかわかりません。呼び出しをコメントアウトすると、プログラムは正常に動作し、クラッシュしません。そうしないと、クラッシュします。私は単純で基本的なことを見落としているだけだと思います。誰か助けてもらえますか?

コードは次のとおりです。

.586
.MODEL FLAT
INCLUDE io.h   
cr  EQU 0dh;carriage return
Lf  EQU 0ah;line feed 
.STACK  4096
.DATA
array   DWORD ?
n       DWORD   0
steps   DWORD   0   
prompt  BYTE    "Enter N: ", 0
count   BYTE    cr, Lf, "Total Numbers: "
string  BYTE    40 DUP (?)
result  BYTE    cr, Lf, "N: "

;result2    BYTE    cr, Lf, "Steps: "
lbl BYTE 11 DUP (?)
BYTE cr, Lf, 0
.CODE
_start    PROC
    output prompt ;ask for n
    input string, 40
    atod string ; convert to int
    mov n, eax  
    dtoa lbl, n ;convert to ascii
    output result; print out n

    push n
    push array
    call syracuse
    add esp, 8
    ret
_start    ENDP
syracuse PROC ; syracuse(n, array)
    push ebp
    mov ebp, esp
    push ebx;save ebx
    push eax;save eax
    push esi
    mov eax, [ebp+8] ;first parameter 
    lea esi, [ebp+12] ;beginning of the array
            mov ecx, 0
    whileLoop:  inc ecx; ecx++
                mov [esi+4], eax
                cmp eax, 1
                je endLoop ;if n = 1, then end
                mov ebx, 2
                idiv ebx
                cmp edx, 0
                je evenProc ; if n is even

                ;if n is odd then 3N + 1
                shl eax, 1
                add eax, 2
                jmp whileLoop               
    evenProc: ;if n is even then N = N/2
        mov ebx, 2
        idiv eax
        jmp whileLoop
    endLoop:
        dtoa lbl, ecx
        output count;display count
        pop esi
        pop eax
        pop ebx
        pop ebp
        ret

syracuse ENDP
END
4

1 に答える 1