汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-08-09 13:24] 顺序表算法练习之:删除数组中重复元素

图片载入中
设计思路:
第一步:用两重循环依次逐个查找相同的元素。 如果存在相同元素,用20h填充。
第二步:将重复元素位置存入pos单元
第三步:将出现重复元素的位置通过栈来实现倒序,如果不倒序的话, 在下面的前移动作中, 略显麻烦。
第四步:循环读取位置,将子串前移,实现目标。
;-----------------------------------------------------
  1 title   delete dup element in array
  2 assume  cs:code,ds:data,ss:stack
  3 data    segment
  4 array   db      30h,32h,32h,34h,32h,31h,33h,35h,32h,38h
  5 pos     db      10 dup (0)
  6 msg1    db      'Before:$'
  7 crlf    db      0dh,0ah,'$'
  8 msg2    db      ' After:$'
  9 data    ends
 10 stack   segment stack
 11         dw      128 dup (0)
 12 stack   ends
 13 code    segment
 14 start:
 15         mov ax,data
 16         mov ds,ax
 17         mov ax,stack
 18         mov ss,ax
 19         mov sp,256
 20 ;----------------------------------------------------------------;
 21 ;print old array
 22         mov dx,offset msg1
 23         mov ah,9
 24         int 21h
 25
 26         mov bx,offset array
 27         mov cx,lengthof array
 28 d1:     mov dl,[bx]
 29         mov ah,2
 30         int 21h
 31         mov dl,' '
 32         mov ah,2
 33         int 21h
 34         inc bx
 35         loop d1
 36         mov dx,offset crlf
 37         mov ah,9
 38         int 21h
 39 ;----------------------------------------------------------------;
 40 ;delete dup element
 41         mov bx,0                        ;ds:bx,First address
 42         mov cx,lengthof array           ;loop times
 43 _out:
 44         push cx                         ;save cx
 45         mov si,bx                       ;
 46         inc si                          ;init si
 47         dec cx
 48 _in:
 49         mov al,[bx]                     ;compare one by one
 50         cmp al,[si]                     ;[bx]=?[si]
 51         jnz next                        ;
 52         mov byte ptr [si],' '           ;fill space
 53
 54 next:
 55         inc si                          ;si++
 56         cmp bx,si                       ;comp bx and si
 57         jz continue                     ;if bx=si,then jump loop
 58         loop _in
 59
 60         pop cx                          ;recover cx
 61         inc bx                          ;bx++
 62         loop _out
 63 ;----------------------------------------------------------------;
 64 continue:
 65         mov si,offset array             ;array first address
 66         mov di,offset pos               ;dest position
 67         mov cx,lengthof array           ;loop times
 68 L1:
 69         mov al,[si]                     ;compare al=20h?
 70         cmp al,20h                      ;
 71         jnz jump
 72         mov ax,si                       ;al=20h,then
 73         mov [di],al                     ;put si into pos[di]
 74         inc di                          ;di++
 75 jump:
 76         inc si                          ;si++
 77         loop L1
 78
 79 ;----------------------------------------------------------------;
 80 ;forward move element
 81         mov bx,offset pos               ;get position
 82         xor ax,ax                       ;
 83         xor cx,cx
 84 L2:     mov al,[bx]                     ;if al=0
 85         cmp al,0                        ;jump L2
 86         jz move
 87         push ax                         ;save bx
 88         inc bx                          ;bx++
 89         inc cx                          ;cx++
 90         jmp L2
 91
 92 move:
 93         mov di,offset pos               ;adjust position
 94 L3:
 95         pop ax
 96         mov [di],al                     ;sign pos
 97         inc di                          ;di++
 98         loop L3
 99
100         mov bx,offset pos
101 L4:
102         mov al,[bx]                     ;if [bx]=0
103         cmp al,0                        ;jump out loop
104         jz over
105
106         mov cx,lengthof array-1         ;loop times
107         sub cl,[bx]
108         mov dl,[bx]
109         mov dh,0
110         mov si,dx                       ;array address
111 L5:
112         mov al,array[si+1]              ;forward move
113         mov array[si],al                ;element,
114         mov array[si+1],' '             ;fill up space
115         inc si                          ;next element
116         loop L5
117
118         inc bx                          ;next pos
119         jmp L4
120 ;----------------------------------------------------------------;
121 ;print new array
122 over:
123         mov dx,offset msg2
124         mov ah,9
125         int 21h
126         mov bx,offset array
127         mov cx,lengthof array
128 d2:     mov dl,[bx]
129         mov ah,2
130         int 21h
131         mov dl,' '
132         mov ah,2
133         int 21h
134         inc bx
135         loop d2
136 ;----------------------------------------------------------------;
137         mov ah,4ch
138         int 21h
139 code    ends
140 end     start
;----------------------------------------------------
作为一个练习, 给我的感觉是题目倒不难, 可是做起来的时候, 需要考虑的细节真的是太多啦! 棋谚有云:一招走错满盘皆输。写程序也一样, 多一个指令少一个指令以及指令所在位置这些细节都会影响程序的正常运行。
评论次数(0)  |  浏览次数(548)  |  类型(程序与练习) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码