在Assembly中合并两个字符串

时间:2016-11-28 08:50:55

标签: assembly arm thumb

我正在尝试以基本方式合并程序集中的两个简单字符串,例如:

字符串1:AAAAAA

字符串2:BBB

结果:ABABABAAA

所以只是交替的角色。

我一直试图这样做,但由于某种原因,我从来没有到达我的字符串上的空终止符,调试器使我甚至无法弄清楚如何找出字符串正在组合起来。

        AREA HW42, CODE, READONLY

        ENTRY

        EXPORT main

main
MAX_LEN EQU 100
    LDR R8, =StrOne
    LDR R9, =StrTwo

Loop
    LDRB R3, [R8], #1
    STRB R3, [r2], #1
    LDRB r4, [r9], #1
    STRB r4, [r2], #1
    ORR R5, R3, R4
    CBZ R5, DONE
    B Loop

    LDR R8, =MixStr
    STR R3, [R8]

DONE
stop
        MOV r0, #0x18
        LDR r1, =0x20026
        SVC #0x11

        ALIGN

        AREA HWData, DATA, READWRITE
        EXPORT adrStrOne
        EXPORT adrStrTwo
        EXPORT adrMixStr

StrOne  DCB "HLO",0
StrTwo  DCB "EL",0
MixStr  SPACE MAX_LEN

adrStrOne DCD StrOne
adrStrTwo DCD StrTwo
adrMixStr DCD MixStr
        ALIGN

        END

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

ORR R5, R3, R4
CBZ R5, DONE

这使得它可能会一直持续到内存和故障结束,因为你的字符串长度不同:

'H' | 'E' != 0
'L' | 'L' != 0
'O' | '\0' != 0
'\0' | ??? != 0 (probably)
...

如果您需要处理不同长度的字符串,则需要单独检查并处理每个字符串的结尾。

事实上,它没有“可能” - 由于你的数据布局,第一个“???”实际上将是MixStr的开头,由于此时为“H”而保证为非零,从那时起你就会将结果的早期部分复制到自身,直到你脱落为止数据部分或内存的结尾,以先到者为准。