字符串比较不起作用

时间:2012-07-21 07:51:04

标签: string assembly x86

我有一个小问题。

这是我的代码:

cmpstr:
pusha
xor cx, cx

mov ax, ds
push ax
mov ax, si
push ax
call strlen
mov dx, ax
mov ax, es
mov ds, ax
mov si, bx
call strlen
cmp al, dl
jnz .fail
pop ax
mov si, ax
pop ax
mov ds, ax

.loop:
    push bx
    mov al, byte [es:bx]
    mov bl, byte [ds:si]

    cmp al, bl
    jne .fail
    cmp bl, 0
    jz .suc

    pop bx
    add bx, 1
    inc si
    inc cx
    jmp .loop
.fail:
    mov al, 'C';
    mov ah, 0Eh
    int 10h
    popa
    mov ax, 0
    jmp .end
.suc:
    mov al, 'D';
    mov ah, 0Eh
    int 10h
    popa
    mov ax, 1
.end:
ret

此过程应比较两个字符串,并返回(movax)1,如果字符串(第一个es:bx,第二个ds:si)相同或0,如果它们与众不同。我的问题是执行程序调用之前的命令,正在打印字母'D'(比较成功)但程序调用后的命令不起作用。我认为这个问题必须在这个程序的某个地方。有人知道这里有什么问题吗?

1 个答案:

答案 0 :(得分:2)

当您使用其中一个条件跳转离开循环时

.loop:
    push bx
    mov al, byte [es:bx]
    mov bl, byte [ds:si]

    cmp al, bl
    jne .fail
    cmp bl, 0
    jz .suc

你推了BX,但你永远不会弹出它。这将使下一个RET进入陌生的地方。