2012-07-21 134 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進入陌生的地方。