-1

此代码应检查字符串是否为回文。

但它总是为任何字符串打印“是”。我该如何解决这个问题?

我认为错误出现在某些跳转指令中。

错误是什么?

include inout.asm
.model small,c
.stack 200h
.data
    pal       db "rear"
    ;pal      db 200 dup("mohammad")
    pal_len   equ $ - pal  - 1
    szYes     db "yes$"
    szNo      db "no$"
.code
.startup

;call gets,offset pal
call puts,offset pal

    lea     si, pal
    lea     di, pal
    add     di, pal_len
    mov     cx, 0
CheckIt:
    mov     al, byte ptr [si]
    mov     dl, byte ptr [di]
    cmp     al, dl
    jne     No
    inc     si
    dec     di
    inc     cx
    cmp     cx, pal_len
    JNE     CheckIt
    lea     dx,szYes

    jmp done

No:
    lea     dx,szNo
done:   
    .exit
end
4

1 回答 1

0

我在您的问题中没有看到打印代码。所以我添加了自己的:

不:
    铅 dx,sz 否
完毕:
    mov 啊,9
    整数 21 小时
    。出口
结尾

并用 MASM 6.11 组装它,它应该为“后”打印“否”,并且对于我尝试过的其他字符串也可以正常工作。我不知道您使用的打印代码。

但是,您的代码中还有其他错误:它不能正确处理长度为 1 的字符串,而是继续比较pal. 发生这种情况是因为您存储到最后一个字符pal_len的相对偏移量,而不是字符串length ,并且在检查是否已经等于之前增加cxwith 。inc cxcxpal_len

所以在这里:

pal_len equ $ - 朋友 - 1

定义pal_len为 3 的值"rear",而不是 4,因为你减去 1。它对于字符串长度不是 1 在这里没有问题(最后一个字符已经与第一个字符进行了比较),但对于 1 的字符串长度失败。用“len”之类的长度命名变量或宏并用它来表示偏移量并不是一个好主意,因为它会引起混淆。

所以,这是整个固定代码:

.model 小,c
.stack 200h
。数据
    朋友数据库“a”
    pal_len equ $ - 朋友
    szYes 分贝“是$”
    szNo db "no$"
。代码
。启动

    莱西,好朋友
    利迪,好朋友
    添加 di, (pal_len-1)
    移动 cx, 0
核实:
    mov al, 字节 ptr [si]
    mov dl,字节 ptr [di]
    cmp al, dl
    没有
    公司
    十二月
    公司
    cmp cx, pal_len
    JNE CheckIt
    lead dx,sz是

    jmp 完成

不:
    铅 dx,sz 否
完毕:
    mov 啊,9
    整数 21 小时
    。出口
结尾
于 2013-03-26T11:53:13.763 回答