2012-07-21 85 views
0

我有一个小问题。字符串比较不起作用

这是我的代码:

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'正在打印(比较成功),但过程调用后的命令不起作用。我认为这个问题一定在这个程序的某个地方。有人知道这里有什么问题吗?

+0

你是否尝试用调试器逐步执行代码? – 2012-07-21 08:00:11

+0

我没有任何16位调试器 – user35443 2012-07-21 09:26:55

+0

我的问题是只是功能没有返回。它正在返回到循环。 – user35443 2012-07-21 09:27:40

回答

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进入陌生的地方。