8086汇编程序来存储唯一值



我一直在制作这个程序,它接受一个列表,在其中找到唯一元素,并将其存储在另一个列表或注册中

下面的代码将主列表放入SI寄存器,然后BX充当一个指针,遍历整个数组以找到相似之处。。。如果没有发现相似性,则SI中的元素(存储在AL中(将存储在DI中。。为了避免BX到达其值的完全相同位置时可能出现的第一个相似性,我为此设置了一个标志。


uniqueElement macro list1 list2
local loop1,comparasionLabel,checkFlag,trigger,nextElement,addElement,endAddition
lea si,list1
lea di,list2 
loop1:
mov ah,00H
mov cx,00H   ;this is an intial flag gets triggered when an initial similarity is spotted
lea bx,list1  ; this will be the search loop which will compare each of it's elements to SI
mov al,BYTE PTR[SI] 
cmp al,'$'  ; since I'm using a '$' terminated string
je endAddition
comparasionLabel:
mov dl,BYTE PTR[BX]
cmp dl,'$'
je addElement
cmp al,dl
je checkFlag
inc bx
jmp comparasionLabel    

checkFlag:           
cmp cx,00H    ; this is when a first similarity is spotted, the flag gets triggered here
je trigger
cmp cx,01H       ; or if it was already triggered and another similarity spotted, SI moves to next element
je nextElement     
trigger:
mov cx,01H
inc bx
jmp comparasionLabel
nextElement:
inc si
jmp loop1
addElement:
mov ah,00h
mov BYTE PTR [di],al
inc di
inc si
jmp loop1        

endAddition:
inc di
mov ah,00H
mov al,'$'
mov BYTE PTR[di],al               
endm

这只是将执行宏的代码

.model small
.data
list1 db 'H3llo$'    
list2 db 50 DUP [?]
.code  
mov ax,@data
mov ds,ax
uniqueElement list1 list2
mov ah,09H
mov dx,offset di
int 21h
.exit

我不知道为什么它一直打印相同的列表而不删除唯一的项目

我不知道为什么它一直打印相同的列表而不删除唯一的项目

<blockquote\
mov ah,09H
mov dx,offset di
int 21h

>错误在打印中。指令mov dx,offset di不正确!如果它会使MASM加载DX寄存器将为零,我不会感到惊讶,因为源文本位于偏移地址零,结果将是:

h3llo

正确的代码如下:

mov  dx, offset list2
mov  ah, 09h
int  21h

除了在输出字符串中引入一个垃圾字符的外来CCD_$&";。


下面是我对你的算法的重写,去掉了很多冗余
我采取了另一种方法,因为我不是标记相似性,而是计数匹配。每个唯一的字符将产生一个匹配,因此只有当计数器具有CX=1时,才会将一个字符添加到输出缓冲区。

lea  si, list1
lea  di, list2 
loop1:
mov  al, [si] 
cmp  al, '$'
je   endAddition
xor  cx, cx       ; Counts matches, will become at least 1
lea  bx, list1
loop2:
inc  bx
mov  dl, [bx-1]
cmp  dl, '$'
je   maybeAddElement
cmp  al, dl
jne  loop2
inc  cx
jmp  loop2
maybeAddElement:
cmp  cx, 1
jne  nextElement
mov  [di], al
inc  di
nextElement:
inc  si
jmp  loop1        

endAddition:
mov  [di], al      ; AL='$'

相关内容

  • 没有找到相关文章

最新更新