[英]Irvine Assembly: merging two different sized arrays
我試圖將這兩個排序數組合並在一起。 我知道問題是程序在達到其大小限制后嘗試比較第一個數組時,但是在弄清楚如何克服這個問題時我迷失了。 任何幫助將非常感激。
include irvine32.inc
Title ArrayMerge
.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
call Merge
call Display
exit
main endp
;=====================================================================
Merge proc
mov ECX,lengthof a3 ;Set loop times
TheLoop:
TheJump:
mov ax,[ESI]
cmp ax,[EDI]
jl AddA1 ;Jump if less
jg AddA2 ;Jump if greater
Loop TheLoop
jmp EndJump
AddA1:
mov ax,[ESI]
mov [EDX],ax
add ESI,2
add EDX,2
jmp TheJump
AddA2:
mov ax,[EDI]
mov [EDX],ax
add EDI,2
add EDX,2
jmp TheJump
EndJump:
ret
Merge endp
;==================================================================
Display proc
mov ECX,lengthof a3 ;Set loop times
mov EDX,offset a3
DisplayLoop:
mov ax,[EDX]
add EDX,2
call writedec
call crlf
loop DisplayLoop
ret
Display endp
;===================================================================
end main
您應該為每個數組中處理了多少個元素維護單獨的計數器。 一旦到達其中任何一個的末尾,只需復制另一個中的其余元素即可。 還要注意,如果元素相等,則不要復制,但應該復制。
i = j = k = 0;
while(i < length1 && j < length2)
{
switch(compare(src1[i], src2[j]))
{
case -1: // src1 is less, copy it
dst[k++] = src1[i++];
break;
case 0: // equal, copy src2 but also increment i
i++;
// fall-through
case 1: // src2 is less, copy it
dst[k++] = src2[j++];
}
}
// at this point we have reached the end of one of the arrays
// just copy remaining elements
// note only one of these loops will do anything
while(i < length1)
{
dst[k++] = src1[i++];
}
while(j < length2)
{
dst[k++] = src2[j++];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.