Irvine Assembly合并数组

时间:2012-12-09 23:30:13

标签: assembly x86 masm irvine32

我需要将已经排序的两个数组合并到另一个更大的数组中,也按顺序合并。我不能使用排序。它组装好但不会显示任何内容。

这是我到目前为止所拥有的。我是新手,所以如果它不是最好的那么容易。

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

1 个答案:

答案 0 :(得分:-1)

TheLoop降至零时会发生什么? ecx变为否定,退出循环然后 KEEPS 转到恰好是AddA1的下一条指令,然后返回TheJump然后再转移到AddA1 }或AddA2,它是一个无限循环。您需要在Loop TheLoop之后和AddA1之前添加一些内容以退出proc。

你真的不需要调试器,只需打印传递的值进行调试。