首页 > 解决方案 > 带有数组和字符串的 LDRB 指令

问题描述

我们目前在课堂上介绍装配基础知识。有两个示例代码片段,分别与数组和字符串有关,它们使用了在其他任何地方都没有使用过的 LDRB 指令。我知道它加载一个字节而不是像 LDR 这样的单词,但我不明白为什么在使用它的地方使用它。该课程的材料中没有给出任何说明。我试着用谷歌搜索它,但我找不到任何东西。

我不知道为什么要使用它,无论是特定于数组和字符串的东西还是正确的语法……我将非常感谢我想理解的解释。代码示例如下:

大批:

.text

entry:    b start

arr:     .byte 10, 20, 25

eoa:

         .align

start:
ldr       r0, =eoa
ldr       r1, =arr
mov       r3, #0

loop:
          ldrb  r2, [r1], #1
          add   r3, r2, r3
          cmp   r1, r0
          bne   loop

stop:
          b stop

细绳:

.text
        b start

str:    .asciz "Greetings and well met"

       .equ   nul, 0

       .align

start:

       ldr   r0, =str
       mov   r1, #0

loop:   
       ldrb  r2, [r0], #1
       add   r1, r1, #1
       cmp   r2, #nul
       bne   loop
       sub   r1, r1,#1

stop:   b stop

标签: assemblyarm

解决方案


我不知道为什么要使用它,无论是特定于数组和字符串的东西还是正确的语法……我将非常感谢我想理解的解释。


LDR 与 LDRB

您需要的主要原因ldrb是它可以寻址一个字节。RAM 是一个单元,它具有取决于硬件的固有大小。有ldrb方法在加载和写入时忽略部分。如果您使用内存映射硬件寄存器,您可能会发现它们的行为不同,您需要以不同的方式访问它们。

如果您考虑str和 ,事情会变得更加困难strb。如果你使用str字节,你会覆盖其他字节。

数组与字符串

通常,数组可以是“字节”以外的大小。但是,您的示例是一个字节数组。不同之处在于字节数组需要存储大小,而字符串有一个保留字符'\x00',它是结束标记。在代码示例中,地址标签eoa用于标记数组的结尾。另一种方法是,

arr:     .word 1b-arr-4     #  Store size of array first
         .byte 10, 20, 25
1:

因此,字符串示例正在寻找零,cmp r2, #nul而数组示例正在寻找大小cmp r1, r0(r1 是当前字符串索引,r0 是eoa)。该数组可以允许数据中的零字符,并且字符串代码在表示上更紧凑(=str=arrplus相比=eoa)。

该字符串类似于称为转义字符和保留字符的通信协议概念。例如,字符 EOS=\x7e可能是字符串的结尾,而 ESCAPE=\x7d是保留的。那么 ESCAPE-!EOS 的组合是字符串中的一个 EOS,而 ESC-!ESC 是字符串中的一个 ESC。该字符串有一个 EOS=\x00和一个不能发生的规则,因此不需要转义。转义有一个缺点,即数据大小与表示的大小不同(一些数据占用两个字节,而另一些只占用一个字节)。如果字符串是 Unicode(UTF8、UTF16 等)也是如此。


推荐阅读