Assembly 如何使用字符串指令和汇编指令查找单词是否为回文?

Assembly 如何使用字符串指令和汇编指令查找单词是否为回文?,assembly,masm,Assembly,Masm,在一个练习中,我被要求编写一个代码,确定字符串数组“string”中的一个单词是否是回文,是否限制此代码的实现。重复untilcxz、esi和edi寄存器。我的想法是将esi指向单词的开头,将edi指向单词的结尾。然而,我相信也会使用本书中介绍的指令,如cmpsb、movsb和scasb。事实证明,esi和edi不能单独控制以调整字符串数组中下一个单词的值。我不知道如何将此练习的解决方案与我目前所学的知识(如cmpbs等)结合起来。假设这个代码看起来像 .686 .model flat, c .

在一个练习中,我被要求编写一个代码,确定字符串数组“string”中的一个单词是否是回文,是否限制此代码的实现。重复untilcxz、esi和edi寄存器。我的想法是将esi指向单词的开头,将edi指向单词的结尾。然而,我相信也会使用本书中介绍的指令,如cmpsb、movsb和scasb。事实证明,esi和edi不能单独控制以调整字符串数组中下一个单词的值。我不知道如何将此练习的解决方案与我目前所学的知识(如cmpbs等)结合起来。假设这个代码看起来像

.686
.model flat, c
.stack 100h
scanf   PROTO   arg2:Ptr Byte, inputlist:VARARG
printf  PROTO   arg1:Ptr Byte, printlist:VARARG


.data
msg1fmt byte 0Ah,"%s",0
msg2fmt byte 0Ah,"%s",0Ah,0Ah,0
msg1 byte "The word is a palindrome",0
msg2 byte "The word is NOT a palindrome",0

string  byte "naman","numan","lapal",0

.code
main proc

mov ecx,3

mov esi,offset string
mov edi,offset string + 4
.repeat
cld
mov ebx,ecx
repe cmpsb                       
sub edi,2                     ;incorrect, because esi and edi already altered by cmpsb

.if ecx == 0
INVOKE printf, ADDR msg2fmt, ADDR msg1
.else
INVOKE printf, ADDR msg2fmt, ADDR msg2
.endif
mov ecx,ebx
lea esi,string
lea edi,string+4
add esi,5
add edi,5
.untilcxz
ret
main endp
end

我很高兴看到你的帮助

我有一些其他的解决方案的想法,但我想让代码尽可能简单。我的意见是保留另一个具有未知值的字符串,然后反向复制每个单词,这样就可以使用esi和edi。我不认为您可以在这里使用
rep cmpsb
,因为它总是在同一方向上递增两个指针,并且您希望它们朝相反的方向移动。您必须使用条件跳转来编写自己的循环,而不是使用
rep
。您仍然可以在循环中使用
cmpsb
,但正如您所指出的,您必须在每次迭代中手动从
edi
中减去2,以使其有效地返回。[…]这可能比更直接的实现更有效,也可能比不上更直接的实现,在这种实现中,您将一个字节加载到寄存器中进行比较,然后手动递增/递减指针。