我需要用汇编语言编写一个类似于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这样的行上测试代码,但是当给出这样的输入时,程序显示第一行更大,尽管这是不正确的。
1条答案
按热度按时间c7rzv4ha1#
字符串
程序仍然工作不正确,如果我给予a和B作为输入,那么它输出第一行更大
在AL中,strcmp 返回的是第二个字符串中的一个字符(例如“b”)和第一个字符串中的一个字符(例如“a”)之间的差。
这意味着最终的解释
型
需要成为
的字符串
因此,您可以改进如何使用缓冲输入功能0Ah,读取How buffered input works。