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