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

このプロシージャは 2 つの文字列を比較し、文字列 (first on 、second ) が同じ場合は 1movを返し、異なる場合は 0 を返します。私の問題は、プロシージャ コールが実行される前にコマンドが実行され、文字 'D' が出力されている (比較が成功した) が、プロシージャ コール後のコマンドが機能しないことです。その問題はこの手順のどこかにあるに違いないと思います。ここで何が悪いのか誰か知っていますか?axes:bxds:si

4

1 に答える 1

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 が奇妙な場所に移動します。

于 2012-07-21T09:53:44.450 に答える