我一直在努力理解cmpsb
如何在汇编中工作,因为我正在尝试执行一个程序,将我认为保存在变量中的输入字符串与已在另一个变量中定义的字符串进行比较,如果两者都是相同的,它应该打印一个' y'如果没有,它会打印一个' n'。我使用了emulator8086中包含的一个示例来解决这个问题。
name "cmpsb"
org 100h
; set forward direction:
cld
;read from keyboard
mov dx, offset teclado
mov ah, 0ah
int 21h
; load source into ds:si,
; load target into es:di:
mov ax, cs
mov ds, ax
mov es, ax
lea si, teclado
lea di, str1
; set counter to string length:
mov cx, size
; compare until equal:
repe cmpsb
jnz not_equal
; "yes" - equal!
mov al, 'y'
mov ah, 0eh
int 10h
jmp exit_here
not_equal:
; "no" - not equal!
mov al, 'n'
mov ah, 0eh
int 10h
exit_here:
; wait for any key press:
mov ah, 0
int 16h
ret
; strings must have equal lengths:
x1:
str1 db 'cadena'
teclado db 7,?,7 dup(" ")
size = ($ - x1) / 2
到目前为止,每当我输入' cadena'在我的输入中,它仍然没有认识到输入和存储的变量都是相同的,所以它打印了一个' n'。请有人帮帮我吗?
答案 0 :(得分:1)
由于您通过DOS函数0Ah获得输入,源将位于 [teclado + 2] 。如果键盘上的用户输入的字符串较短(超过6个字符),则结果将不符合您的预期。你必须检查这种情况。
k$township72<-rep(0,475)
Warning message:
In k$township72 <- rep(0, 475) : Coercing LHS to a list
size 的计算不应包含 teclado 。只需将它向上移动即可。
; load source into ds:si
; load target into es:di
mov ax, cs \
mov ds, ax | Better move these 3 lines to the top of your program
mov es, ax /
lea si, [teclado + 2]
lea di, str1
; set counter to string length:
mov cx, size
; compare enough characters
cmp [si-1], cl ;[si-1] is where you had a ? in teclado
jne not_equal
; compare until equal:
repe cmpsb
jnz not_equal