题目:比较两个的字符串 STRING1 和 STRING2 是否相同?若相同把 AX 的内容置 1;若不同,则把AX的内容置 0。

在 DATA SEGEMNT 定义两个字符串 string1,string2,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;比较两个的字符串STRING1和STRING2是否相同,
;若相同把AX的内容置1;若不同,则把AX的内容置0。
;串指令与非串指令实现实现

DATAS SEGMENT
    ;此处输入数据段代码  
    string1 db 'ABCDEF'
    string2 db 'ABCDEF'
    len1 equ $-string1
    len2 equ $-string2 

DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov es,ax
    mov bl,len1
    mov bh,len2
    cmp bl,bh
    jne fin

    mov cx,len1
    lea si,string1 ;DS:SI
    lea di,string2 ;ES:DI
   
    cld
    repe cmpsb
    jne next1
    mov ax,1
    jmp fin
next1:
    mov ax,0
fin:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

但是不能得到正确结果,debug 时发现len1 并不等于 6,而是C(十六进制,12),根据这个回答

$ is the address of the current position before emitting the bytes (if any) for the line it appears on.

$ -string1 == here - string1 ,也就是计算string1的长度时包含了string2的长度,length1 包含string2 的长度, 所以修改数据段代码为:

1
2
3
4
5
6
7
DATAS SEGMENT
    ;此处输入数据段代码  
    string1 db 'ABCDEF'
    len1 equ $-string1
    string2 db 'ABCDEF'
    len2 equ $-string2 
DATAS ENDS

解决问题。


利用非串指令的解法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
DATAS SEGMENT
    ;此处输入数据段代码  
    string1 db 'ABCDEE'
    len1 equ $-string1
    string2 db 'ABCDEF'
    len2 equ $-string2 
  
   
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov es,ax

    mov bl,len1
    mov bh,len2
    cmp bl,bh
    jne fin

    mov cx,len1
    lea si,string1 ;DS:SI
    lea di,string2 ;ES:DI
   
lop:
    mov al,[si]
    mov bl,[di]
    cmp al,bl
    jne next1
    inc si
    inc di
    loop lop
    mov ax,1
    jmp fin
next1:
    mov ax,0
fin:
    MOV AH,4CH
    INT 21H
CODES ENDS