我一直在制作这个程序,它接受一个列表,在其中找到唯一元素,并将其存储在另一个列表或注册中
下面的代码将主列表放入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='$'