assembly ASMx86中的TASM strcmp模拟

x8diyxa7  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(110)

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

c7rzv4ha

c7rzv4ha1#

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
data segment
    first db 255, 254 dup (0)
    second db 255, 254 dup (0)

因此,您可以改进如何使用缓冲输入功能0Ah,读取How buffered input works

相关问题