Assembly 欧文汇编合并数组
我需要将已经排序的两个数组合并到另一个更大的数组中,也是按顺序。我不能用排序。它组装得很好,但不会显示任何内容 这就是我目前所拥有的。我是新来的,所以如果不是最好的,那就放轻松Assembly 欧文汇编合并数组,assembly,x86,masm,irvine32,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 mo
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
当循环降至零时会发生什么情况
ecx
变为负值,退出循环,然后继续执行下一条指令,该指令恰好是AddA1
,然后返回到跳转,然后跳转到AddA1
或AddA2
,这是一个无限循环。您需要在循环循环之后和AddA1
之前添加一些内容以退出该过程
您不需要真正的调试器,只需要打印通过的值以进行调试的调试器。它不显示任何内容,因为它从不离开合并
过程!!!进程的退出条件在哪里?你基本上有一个无止境的循环。。。学习使用调试器,或者更好,创建一个将打印值的调试宏…感谢您的帮助。在课堂上,我们只使用文本编辑器。我可能应该使用调试器。但是ECX没有设置循环时间吗?在a3(数组3)的长度之后,它不会停止吗。对不起,这些愚蠢的问题我对这一切都不熟悉。谢谢,我知道事情会很简单。除了一些其他问题外,它还起作用。你帮我省了几个小时的时间盯着同一个东西看。循环指令首先递减ECX,然后比较它为零。如果不为零,则分支到给定的标签。如果ECX变为零,则它将退出到循环
指令之后的指令。ECX不会变为负数,但它会变为零。如果ECX在遇到循环
指令之前等于零,则在这种情况下,它将递减1(变为负数),并且它还将跳转到指定的标签,因为ECX在递减后不等于零)。