在汇编

时间:2015-05-25 23:31:07

标签: assembly x86-16

我一直在努力理解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'。请有人帮帮我吗?

1 个答案:

答案 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