我需要用汇编语言编写 C 编程语言中 strsmp 函数的类似函数。我的程序似乎正确检测字符串相等性,但如果它们不相等,那么在我提出的各种测试中,它总是返回第一个字符串大于第二个字符串。请告诉我我做错了什么。
assume cs: code, ds: data
data segment
first db 255, 254 dup (0)
second db 255, 254 dup (0)
bigger_s db " first string is bigger than second$"
smaller_s db " second string is bigger than first$"
equal_s db " they are equal$"
data ends
code segment
input proc
push bp
mov bp, sp
mov dx, [bp+4]
xor ax, ax
mov ah, 0Ah
int 21h
mov dx, [bp+4]
inc dx
mov si, dx
mov cx, [si]
xor ch, ch
add si, cx
mov byte ptr [si+1], '$'
inc dx
pop bp
ret
input endp
print proc
push bp
mov bp, sp
mov dx, [bp+4]
add dx, 2
xor ax, ax
mov ah, 09h
int 21h
pop bp
ret
print endp
endl proc
mov ah, 02h
mov dl, 0Ah
int 21h
ret
endl endp
strcmp proc
push bp
mov bp, sp
mov si, [bp+4]
mov di, [bp+6]
compare_loop:
mov al, [si]
mov bl, [di]
cmp al, bl
je continue
sub al, bl
pop bp
ret
continue:
inc si
inc di
cmp al, 0
jne compare_loop
xor ax, ax
pop bp
ret
strcmp endp
main:
mov ax, data
mov ds, ax
push offset first
call input
call endl
push offset second
call input
call endl
push offset first + 2
push offset second + 2
call strcmp
cmp ax, 0
je equal_strings
jg first_is_greater
jl second_is_greater
equal_strings:
push offset equal_s
call print
jmp exit_program
first_is_greater:
push offset bigger_s
call print
jmp exit_program
second_is_greater:
push offset smaller_s
call print
exit_program:
call endl
mov ah, 4ch
int 21h
code ends
end main
我尝试在 a 和 b 等行上测试代码,但是当给出这样的输入时,程序显示第一行更大,尽管这是不正确的。
sub al, bl pop bp ret
程序仍然无法正常工作,如果我给出 a 和 b 作为输入,那么它输出第一行更大
AL 中返回的 strcmp 是第二个字符串(在“b”中)中的字符与第一个字符串(在“a”中)中的字符之间的差异。
这意味着最终解释权
cmp ax, 0 je equal_strings jg first_is_greater jl second_is_greater equal_strings:
需要成为
cmp AL, 0 ; In casu AL == "b" - "a" == 1
JL first_is_greater
JG second_is_greater
equal_strings:
cmp al, 0 jne compare_loop
strcmp中的另一个问题:测试字符串结尾应使用 $ 字符,因为它是您的 input 过程所替换的终止符。
cmp al, "$"
jne compare_loop