assembly - 检查字符串是否是没有标点符号的回文
问题描述
我有这个代码:
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 中),那么它就可以工作。
解决方案
您可以大大简化循环结束条件。 do{ ...; r0++, r1--; }while(r0<r1);
您不必关心他们是否相互通过或完全相遇,只需cmp
/ blo
(如果无符号“下”则为分支)。
然后,您可以将跳过的非字母字符添加到两个指针增量中。(您似乎甚至没有尝试这样做,所以它当然会发现这"abc ba"
不是回文。当您考虑所有 6 个字节时,这不是。)
此外,您bx lr
在返回路径中丢失了。使用调试器单步执行,以查看两条mov r0, #value
指令的执行情况。
推荐阅读
- c# - 如何在 C# 中验证电子邮件
- node.js - 如何在nodejs中将req.files.resume.data转换为createReadStream
- image-processing - 色度键使用 FFMPEG 将绿色部分替换为另一个图像
- html - 如何在导航栏中的“导航栏品牌”下移动“导航”元素
- swift - 在 Double 和 Int 之间转换时出错
- java - 使用箭头键控制连接到 TextField 的 JavaFX ContextMenu
- node.js - 为什么我们要避免在 Ubuntu 上使用 apt-get 安装 Node.js?
- string - 为什么可空 cursor.getString() 分配给不可空字符串编译?
- c# - 如何制作字符串变量文字?
- python - 用元素组合替换列表中的变量