ASMx86 中的 TASM strcmp 模拟

问题描述 投票:0回答:1

我需要用汇编语言编写 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 等行上测试代码,但是当给出这样的输入时,程序显示第一行更大,尽管这是不正确的。

assembly x86 tasm
1个回答
0
投票
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
    
© www.soinside.com 2019 - 2024. All rights reserved.