0

我正在尝试使汇编程序连接两个字符串。这是我的程序。

        AREA Assignment4, CODE, READONLY
    ENTRY   

;;;;;;;;;;Setting Up

    ADR r0, StrF    ;Address of first block in destination        

    ;;;String 1
    ADR  r1, Str1   ;Address of first string
    ADR  r2, EoS    ;Address of EoS1
    SUBS r2, r2,r1  ;Length of str1, counter

    ;;;;String2
    ADR r3, Str2    ;Address of second string
    ADR r4, EoS2    ;Address of EoS2
    SUBS r4, r4,r3  ;Length of Str2 

;;;;;;;;;;Performing Actions

    ;;;;First String
Loop    LDRB r5,[r1],#1     ;Load next bit of "r1" in r5
    STRB r5,[r0],#1     ;Store prev bit in memory at r0
    SUBS r2, r2, #1     ;Decrement counter
    CMP r2, #0          ;Compare our counter
    BNE Loop            ;Branch if counter != 0

    ;;;;;Second String
Loop2   LDRB r5,[r3],#1     ;Load next bit of "r3" to r5
    STRB r0,[r5],#1     ;Store this bit in r0
    SUBS r4, r4, #1     ;Decrement length counter
    CMP r4, #0          ;Compare our counter
    BNE Loop2           ;Branch if counter != 0

            ;; Testing the memory - Delete these lines later
    ADR r0, StrF
loop3   LDRB r1,[r0],#1
    B   loop3   


Finished    B   Finished


Str1    DCB "This is a test string1"  ;Str1
EoS     DCB 0x00
Str2    DCB "This is a test string2"  ;Str2
EoS2    DCB 0x00
StrF    DCB 0x00    ;Saving this

    END

我的问题在第 22 + 29 行。我不知道如何成功地将当前字节存储到内存中;更具体地说,寄存器 r0 中的内存,最初由 StrF 初始化。

关于如何修复我的 STRB 或 STR 的任何想法?

一旦我通过那条线,我就会得到这个:

“错误 65:0x00000082 处的访问冲突:没有‘写’权限”这是我试图保存到的 StrF 的内存地址。

4

2 回答 2

0

你在第一行看到那个大的“READONLY”了吗?

由于 strF 与声明为只读的代码位于同一区域,因此它当然不起作用。

您应该将 strF 放在声明为 readwrite 的不同区域中,但那时您将无法使用 adr。

总而言之,您应该设计例程,使它们从调用者那里接收内存地址作为参数。

于 2013-11-13T02:42:52.720 回答
0

我遇到了这个问题,所以如果您使用的是keil,当您处于调试模式时,请转到调试-> memorymap,然后手动添加内存范围

0x00000048 ,0x0000011A 

并检查读、写 a/o 执行

检查此页面 调试器:错误 65(访问违规)

于 2013-12-05T15:50:36.363 回答