Assembly 用于DOS的x86程序集中的回文检查代码出错

Assembly 用于DOS的x86程序集中的回文检查代码出错,assembly,x86,dos,Assembly,X86,Dos,这段代码应该检查字符串是否为palindome 但对于任何字符串,它都会打印“是”。我如何解决这个问题 我认为错误在某些跳转指令中 错误是什么 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

这段代码应该检查字符串是否为palindome

但对于任何字符串,它都会打印“是”。我如何解决这个问题

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

错误是什么

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

我在你的问题中没有看到打印代码。因此,我添加了我自己的:

No: lea dx,szNo done: mov ah,9 int 21h .exit end 将
pal_len
定义为
“后方”
的值为3,而不是4,因为减去1。对于除1以外的字符串长度(最后一个字符已经与第一个字符进行了比较),它可以正常工作,但对于长度为1的字符串,它将失败。在length中使用类似“len”的名称命名变量或宏,并使用它表示偏移量不是一个好主意,因为这会导致混淆

下面是整个固定代码:

.model small,c .stack 200h .data pal db "a" pal_len equ $ - pal szYes db "yes$" szNo db "no$" .code .startup lea si, pal lea di, pal add di, (pal_len-1) 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: mov ah,9 int 21h .exit end .小型模型,c .堆栈200h .数据 pal db“a” pal_len eq$-pal szYes db“yes$” szNo db“no$” .代码 .启动 莉丝,朋友 莱迪,朋友 添加di(pal_len-1) mov-cx,0 核对: mov al,字节ptr[si] mov dl,字节ptr[di] 化学机械抛光铝 jne号 国际公司 德克迪 国泰航空公司 cmp-cx,pal_-len 检查一下 lea dx,szYes jmp完成 不: 李安 完成: 莫夫啊,9 int 21h 出口 结束
有人来帮我吗?用调试器看看你的代码在做什么:好的,thx,,,你知道我如何用tasm调试文档吗?tasm是汇编程序,不是调试器。有Turbo调试器(尚未使用)。(免费软件)和游戏工具(G3X)(可能仍然可以在某处找到)也很有用。在某些地方仍然可以找到SoftIce for DOS的旧版本。但我不知道DOS调试器的最新发展(如果有的话,现在谁在DOS中编写代码?),我知道 .model small,c .stack 200h .data pal db "a" pal_len equ $ - pal szYes db "yes$" szNo db "no$" .code .startup lea si, pal lea di, pal add di, (pal_len-1) 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: mov ah,9 int 21h .exit end