题目
在附加段中,有一个首地址为LIST的未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已经存放在DI寄存器中,AX寄存器中存放着一个数。要求在数组中查找该数,如果找到将其从数组中删除。
思路
这一程序首先查找数组中是否有AX,如果没有则不对数组做任何处理就结束,如果找到这一元素,则把此数后的元素向前移动一个字,如果找到的元素正好位于数组末尾,则直接修改数组长度就可以了。这里巧妙地用到了串比较指令scasw,计数器cx在串比较指令完成后其实就是需要移动数组的个数。
代码
datasg segment
list dw 6,3,4,8,2,7,10 ;第一位存放数组的长度
num dw 0
datasg ends
;---------------
codesg segment
assume ds:datasg,cs:codesg,es:datasg
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
;----------------
mov ax,num
mov di,0
cld
push di ;保存首地址
mov cx,es:[di] ;cx保存个数
add di,2
repne scasw ;字查找
je delete
pop di ;如果没找到
jmp short exit
delete:
cmp cx,0
je dec_cnt ;如果是最后一个则直接删除
next_el:
mov bx,di
mov ax,es:[di]
mov es:[di-2],ax
loop next_el
dec_cnt:
pop di
dec word ptr es:[di] ;首地址—1,最后一个不用删除
exit:
ret
;----------------
main endp
codesg ends
end start
调试
一、首先测试没有找到的情况
反汇编
AX = 0
不难看出没有找到,不做任何处理
二、测试找到的数在末位的情况
AX = 10
找到了,但cx=0,则跳去dec_cnt 直接修改数组长度
数组长度发生改变,其他没有变化
三、测试不在末位的情况
AX = 7
查找过后cx = 1,需要移动数组一位
一路t,最后查看数据段,07已经被删除