2015-10-05 71 views
0

我正在尝试编写ARM assembly中的字符串比较函数。
比较两个字符串AB后,应将其中一个存储在内存中。
如果不相等,字符串B将被保存在内存中。在下面的代码,存储操作在标签执行命名StoreAStoreB(下面的代码是不完整的代码)STRB指令看起来不适用于ARM程序集

我希望下面的代码到字符H存储然而0x00040000STRB指令似乎不工作。
请给我一个建议。

AREA Assignment1_2, CODE, READONLY 
     ENTRY 
Main 
    LDR r0,=String1 
    LDR r1,=String2 

Compare    ; main loop 
    LDRB r2, [r0, r5] 
    LDRB r3, [r1, r5] 

    CMP r2, #0 
    BEQ IsEnd1 

    CMP r3, #0 
    BEQ IsEnd2 

    ADD r5, r5, #1 
    B Compare 


; check if the string ends 
IsEnd1 
    CMP r3, #0 
    BEQ StoreA  ; equal 
    B  StoreB  ; not equal 

IsEnd2 
    CMP r2, #0 
    BEQ StoreA  ; equal 
    B  StoreB  ; not equal 


; store string 
StoreA     ;equal 
    SUB r0, r0, r5 
    B Endline 

StoreB     ;not equal 
    LDRB r3, [r1] 
    STRB r3, TEMPADDR 
    B Endline 

Endline 
    MOV pc, lr 

TEMPADDR & &00040000 
String1 DCB "Hi", 0 
String2 DCB "Hik", 0 

    END 
+2

#1:我没有看到任何'r5'的初始化。 #2:目标设备的内存映射是什么?就我们所知,00040000可能在ROM中的某处。 – Michael

+0

请指责'STRB'或其他说明时请小心。据了解,存在处理器错误,但不太可能会遇到处理器错误。 –

+0

您正在存储单个字节,而不是整个字符串。此外,这段代码并没有做任何接近你在你的评论中提出的建议。最后,未初始化的r5是一场灾难。 –

回答

0

主循环Compare只为字符串终止检查,并不比他们的内容。我在为这个处理器编写代码方面只有很少的经验,所以我只能猜测需要什么指令来检查每个字符串中的字符。

此外,遇到0字符串末尾标记时分支到的两个代码块仅比较字符串是否具有相同的长度。

而“其中一个将被存储在内存中”是一种错误的信念。这两个字符串已经存储在内存中。