【问题标题】:Beginner ARM Assembly Question初学ARM组装题
【发布时间】:2011-02-08 04:23:51
【问题描述】:

如何正确地将预定义 .byte 的值加载到寄存器中?例如常量定义为:

constant:   .byte   'a'

我正在尝试:

 ldr r0, =constant
 ldr r1, [r0]

但是,模拟器在第二行之后停止并给出错误“访问未对齐的内存位置,错误地址”只要不包括第二行,其余代码就可以正常运行。

完整代码:

;   r0  is a pointer to msg1
;    r1  used to store the value of val
;   r2  used to compare a character in msg1
;   r3  counter for the number of comparisons

    .text
    .global _start  
_start:
        ldr r0, =msg
        ldr r1, =val
        ldr r1, [r1]
        mov r3, #0

loop:   ldr r2, [r0]    
        cmp r2, #0
        beq done
        cmp r0, r1
        add r0, r0, #4
        bne loop
        add r2, r2, #1
        b loop

done:
        swi 0x11

    .data
    .align
msg:    .asciz  "How many 'a's are in this string?"
val:    .byte   'a'
    .end

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    您可以使用ldrb 将单个字节从字节对齐指针加载到寄存器中。我希望这就是您正在寻找的:

    ldr  r0, =val
    ldrb r1, [r0]
    

    您可能希望在循环中使用相同的内容,否则一旦您前进到非字对齐地址的第一个字符(可能是How 中的o),您将以同样的方式崩溃:

    loop:    ldrb r2, [r0]
    

    【讨论】:

    • @Michael Burr,我的意思是与具有更多限制对齐的指针相反。
    【解决方案2】:

    你正在处理字节;没有对齐问题。您还忘记了增加计数器并与错误的寄存器进行比较。这是一个可行的解决方案:

    ;   r0  is a pointer to msg1  
    ;   r1  used to store the value of val  
    ;   r2  used to compare a character in msg1  
    ;   r3  counter for the number of comparisons  
    
    .text  
    .global _start  
    _start:  
            ldr r1, =val  
            ldr r0, =msg  
            ldrb r1, [r1]  
            mov r3, #0  
    
    loop:   ldrb r2, [r0],#1  
            cmp r2, #0  
            beq done  
            cmp r2, r1  
            addeq r3,r3,#1  
            b loop  
    done:  
            swi 0x11  
    
    .data  
    msg:    .asciz  "How many 'a's are in this string?"  
    val:    .byte   'a'  
    .end  
    

    【讨论】:

      【解决方案3】:

      你在填充字节的地址吗?它需要偶数地址(字)填充。甚至可能根据您的

      填充双字

      【讨论】:

      • 我不清楚你所说的“填充字节地址”是什么意思。
      • 你必须要对齐-对齐-填充->对齐
      • 我不确定您的回答或评论是否有意义。当然msgval在数据部分的对齐不是OP的问题。
      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多