首页 > 解决方案 > 检查字符串是否是没有标点符号的回文

问题描述

我有这个代码:

    AREA palindrome, CODE, READONLY

SWI_Exit EQU 0x11

      ENTRY

start

      LDR   r0,=string

      MOV   r1,r0

loop  LDRB  r2,[r1],#1

      CMP   r2,#0

      BNE   loop

      SUB   r1,r1,#2

      BL    pal

stop  SWI   SWI_Exit

 

pal   MOV   r10,#0x0

again LDRB  r3,[r0]

      LDRB  r4,[r1]

      CMP   r3,r4

      BNE   notpal

 

      CMP   r0,r1

      BEQ   waspal

      ADD   r2,r0,#1

      CMP   r2,r1

      BEQ   waspal

      ADD   r0,r0,#1

      SUB   r1,r1,#1

      B     again

 

waspal      MOV   r0,#0x1

notpal      MOV   r0, #0x2

 

string      DCB   "abcba",0

      END

但是现在它只检查它是否是没有任何标点符号的字符串的回文。我希望这样当我输入一个带或不带标点符号和空格的字符串时,它将 1 存储在 r0 中,如果不是,则存储 2。

所以现在当我进入时:

"abcba"

我知道这是一个回文,但是当我有

"abc ba"

它被算作不是回文。

我也有这个错误,它在完成循环时不会在寄存器 0 中存储任何值。但是,如果我更改它以便将结果存储在两个不同的寄存器中(一个在 r0 中,一个在 r10 中),那么它就可以工作。

标签: assemblyarm

解决方案


您可以大大简化循环结束条件。 do{ ...; r0++, r1--; }while(r0<r1); 您不必关心他们是否相互通过或完全相遇,只需cmp/ blo(如果无符号“下”则为分支)。

然后,您可以将跳过的非字母字符添加到两个指针增量中。(您似乎甚至没有尝试这样做,所以它当然会发现这"abc ba"不是回文。当您考虑所有 6 个字节时,这不是。)

此外,您bx lr在返回路径中丢失了。使用调试器单步执行,以查看两条mov r0, #value指令的执行情况。


推荐阅读