将首地址为MEM的100个字的数组中所有为0的项删除 ;并将后续项向前压缩,最后将数组剩余部分补上0。方法2!!!

版权声明: https://blog.csdn.net/weixin_42000150/article/details/80659542

;方法2

;将首地址为MEM的100个字的数组中所有为0的项删除

;并将后续项向前压缩,最后将数组剩余部分补上0
DATA SEGMENT
MEM DW 1,2,0,3,0,0,4,5,0,0
COUNT DW ($-MEM)/2
DATA ENDS

STACK SEGMENT PARA STACK
      DW 128 DUP(?)
TOP   LABEL WORD
STACK ENDS

CODE SEGMENT
     ASSUME SS:STACK,CS:CODE,DS:DATA
MAIN PROC FAR
START:
         MOV AX,DATA
MOV DS,AX
 
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
 
MOV CX,COUNT
LEA SI,MEM
SUB SI,2        ;先减2再加2相互抵消
 
L1: CMP CX,0        ;在数组中找到0后定位
JZ  EXIT
ADD SI,2
DEC CX
MOV AX,[SI]
CMP AX,0
JNZ  L1
MOV DI,SI
PUSH CX
 
L2: CMP CX,0        ;在定位的位置往后找非0,找到后定位;若再无非0项,则程序结束
JZ  EXIT
ADD DI,2
DEC CX
MOV AX,[DI]
CMP AX,0
JZ  L2
MOV [SI],AX      ;将非0项复制到0项,并将非0项清零,继续在0定位位置往后找0
MOV WORD PTR [DI],0
POP CX
JMP L1
 
EXIT:LEA SI,MEM       ;输出数组
MOV CX,COUNT
L3: MOV DX,[SI]
         ADD SI,2
ADD DL,30H
MOV AH,2
INT 21H
LOOP L3 
         MOV AX,4C00H
         INT 21H
CODE ENDS
MAIN ENDP
     END START

猜你喜欢

转载自blog.csdn.net/weixin_42000150/article/details/80659542