0

すでにソートされている2つの配列を、同じ順序で別の大きな配列にマージする必要があります。ソートは使えません。うまく組み立てられますが、何も表示されません。

これは私がこれまでに持っているものです。私はこれに慣れていないので、それが最善ではない場合は簡単に行ってください。

include irvine32.inc
Title MergeArrays
.data
    a1 dw 1,3,4,7,9,15,17
    a2 dw 2,6,8,10,11,14,18,19
    a3 dw 15 dup(0)

.code
main proc
    sub EAX,EAX
    mov ESI,OFFSET a1
    mov EDI,OFFSET a2
    mov EDX,OFFSET a3
    mov ECX,lengthof a3 ;Set loop times

    call Merge
    call Display
    exit
    main endp
    jmp Endit

;=====================================================================
Merge proc
    TheLoop:
    TheJump:
    mov ax,[ESI]
    cmp ax,[EDI]
    jl AddA1        ;Jump if less
    jg AddA2        ;Jump if greater
    Loop TheLoop

    AddA1:
    mov ax,[ESI]
    mov [EDX],ax
    inc ESI
    inc EDX
    jmp TheJump

    AddA2:
    mov ax,[EDI]
    mov [EDX],ax
    inc EDI
    inc EDX
    jmp TheJump
Merge endp
;==================================================================
Display proc
    mov ECX,lengthof a3 ;Set loop times
    mov EDX,OFFSET a3

        DisplayLoop:
        mov ax,[EDX]
        call writedec
        call crlf
        inc EDX
        loop DisplayLoop
Display endp
;===================================================================


Endit:
end main
4

1 に答える 1

-1

TheLoopがゼロ になるとどうなりますか?ecx負になり、ループを終了してから、 KEEPS が次の命令に進みます。次の命令は、たまたま次の命令に戻り、またはのいずれかに戻りAddA1ます。これは無限ループです。procを終了するには、前後に何かを追加する必要があります。TheJumpAddA1AddA2Loop TheLoopAddA1

デバッガーは実際には必要ありません。デバッグ用に渡された値を出力するものだけです。

于 2012-12-10T00:30:44.227 に答える