Link指向一个字线性表,其中的首单元保存线性表的长度,编制程序将该线性表中内容为0FFFFH的项删除,并更新线性表长度

; Link指向一个字线性表,其中的首单元保存线性表的长度,编制程序
; 将该线性表中内容为0FFFFH的项删除,并更新线性表长度
; 线性表长度是指线性表中实际元素的个数,这里这里不包括首单元
; 删除要求项后应更新首单元,输出线性表时不应包含0FFFFH项
; 而其他项的先后次序保持不变
DATA SEGMENT
Link DW 16,12,2,4,82,0FFFFH,92,92,0FFFFH,999,99,100,0FFFFH,98,58,0FFFFH,7
FINAL DW $
CRLF DB 0AH,0DH,'$'
DATA ENDS

STACK SEGMENT PARA STACK
DW 128 DUP(?)
TOPLABEL WORD
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
MAIN PROC FAR
START:
MOV AX,DATA
MOV DS,AX

MOV AX,STACK
MOV SS,AX
LEA SP,TOP

LEA SI,Link

L3:ADD SI,2; SI指向找到的0FFFFH项
CMP SI,FINAL
JAE EXIT0
MOV AX,[SI]
CMP AX,0FFFFH
JNE L3

MOV DI,SI; 用DI往后找到非0FFFFH项覆盖SI指向的0FFFFH项
L2: ADD DI,2
CMP DI,FINAL
JAE EXIT0
MOV AX,[DI]
CMP AX,0FFFFH
JEL2
MOV BX,[SI]
MOV [SI],AX
MOV [DI],BX
JMP L3


EXIT0:; 统计线性表有效元素个数,包含首单元和实际元素
LEA SI,Link
MOV BX,[SI]
INC BX
XOR CX,CX
EXIT1:
MOV AX,[SI]
CMP AX,0FFFFH
JNE ADDC
EXIT2:
LEA DI,Link
DEC CX; 首单元的值为实际元素的个数,故要减去首单元本身,即减1
MOV [DI],CX
JMP EXIT
ADDC:INC CX
CMP CX,BX
JAE EXIT2
ADD SI,2
JMP EXIT1
EXIT:
INC CX; 输出时首单元的内容一起输出,故加1
MOV BX,10
SUB DI,2

L6: PUSH CX; 多个多位十进制数的输出
ADD DI,2
MOV AX,[DI]
XOR CX,CX
L4: XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JNE L4

L5: POP DX
ADD DL,30H
MOV AH,2
INT 21H
LOOP L5

MOV AH,9
LEA DX,CRLF
INT 21H

POP CX
LOOP L6

MOV AH,4CH
INT 21H
CODE ENDS
MAIN ENDP
END START

    推荐阅读