题目
已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一程序,把既在A中又在B中出现的整数存放于数组C中。
思路
取出数组A中的元素放入AX,用串查找指令查找AX是否出现在数组B中,如果出现则放入数组C。在查找过程中涉及到二重循环,一是取出数组A中的元素,二是scasw在B查找,我都使用了cx计数器,做法是在scasw查找B之前先把cx push到堆栈里,之后再弹出。
代码
datasg segment
array_A dw 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 ;15个数
array_C dw 15 dup(?)
datasg ends
extendsg segment
array_B dw 1,14,1,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0 ;20个数
extendsg ends
;-------------
codesg segment
assume ds:datasg,cs:codesg,es:extendsg
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,datasg
mov ds,ax
mov ax,extendsg
mov es,ax
;--------------------
xor si,si
xor di,di
mov cx,15
search_A:
push cx ;两重循环都用cx
mov ax,array_A[si]
mov cx,20
cld
lea di,array_B
repne scasw ;字查找
je insert ;相等
jmp next
insert:
mov array_C[di],ax
add di,2
next:
add si,2
pop cx
loop search_A
;--------------------
exit:
ret
main endp
codesg ends
end start
调试
同样还是反汇编
go到0015吧,然后查看数据段和附加段的分布情况,发现是我们想要的数据。
一路t下去,发现第一个数0可以找到
第二个数1也能找到
发现该数已经写入数组C
跳过每个循环,直到最后一个
发现已经写入数组C