【问题标题】:Check to see if a string is a palindrome without punctuation检查字符串是否是没有标点符号的回文
【发布时间】:2020-10-30 04:30:02
【问题描述】:

我有这个代码:

    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 中),那么它就可以工作了。

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

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

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

    另外,您的返回路径中缺少bx lr。使用调试器单步执行,以查看执行通过两个 mov r0, #value 指令。

    【讨论】:

    • 您介意是否可以使用更正的代码发布答案?我真的很感激。我不太熟悉 do while 循环。
    • @StuartFong:我不打算为你做作业。甚至没有尝试跳过标点符号。我只是将其发布为答案,因为评论太长了。此外,您还没有准确定义“标点符号”是什么。您是否要跳过每个非字母字符,以便同时保留小写和大写字母?我假设只有 ASCII,而不是 UTF-8 或其他东西......它应该像用扫描替换指针增量一样简单,直到你在那个方向找到下一个字母字符(或者点击字符串的开头或结尾,所以这是一个角落案例...)
    • 很公平。我所说的标点符号是大写字母、空格和任何非字母字符。当您说它像“简单地用扫描替换指针增量直到找到该方向的下一个字母字符”一样简单时,是否有一种方法可以检查字符是标点符号,因为我使用的是 ASCII 字符,以及它们之间的范围大写字母为 41-5A,小写字母为 61-7A。是否有只检查字符是否在该范围内的操作?
    • @StuartFong:是的,存在关于检查字节是否为字母字符的 Stack Overflow Q&As。例如How can I check if a character is a letter in assembly? 是 x86 版本或优化范围检查(使用 OR / SUB / CMP+分支的单个序列检查上限或下限。)或者只是简单的范围检查 c >= 'a' && c <= 'z' 幼稚的方式,有两个分支,在 ARM asm 中:ARM Assembly - Change input file to only include capital letters and spaces, write to output
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多