8086系列(4):查找数组中的数并将其删除

题目

在附加段中,有一个首地址为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已经被删除

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值