Assembly 带数组和字符串的LDRB指令
我们目前正在课堂上学习组装基础知识。有两个示例代码段,分别与数组和字符串有关,它们使用的LDRB指令在其他任何地方都没有使用过。我知道它加载的是一个字节,而不是像LDR这样的单词,但我不明白为什么在使用它的地方使用它。课程材料中没有给出任何说明。我试着用谷歌搜索,但什么也找不到 我不知道为什么要使用它,不管是数组和字符串的特定内容还是正确的语法。。。如果我想理解,我将非常感谢您的解释。代码示例如下所示: 数组:Assembly 带数组和字符串的LDRB指令,assembly,arm,Assembly,Arm,我们目前正在课堂上学习组装基础知识。有两个示例代码段,分别与数组和字符串有关,它们使用的LDRB指令在其他任何地方都没有使用过。我知道它加载的是一个字节,而不是像LDR这样的单词,但我不明白为什么在使用它的地方使用它。课程材料中没有给出任何说明。我试着用谷歌搜索,但什么也找不到 我不知道为什么要使用它,不管是数组和字符串的特定内容还是正确的语法。。。如果我想理解,我将非常感谢您的解释。代码示例如下所示: 数组: .text entry: b start arr: .byte 1
.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
我不知道为什么要使用它,不管是数组和字符串的特定内容还是正确的语法。。。如果我想理解,我将非常感谢您的解释
LDR vs 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
与=arr
加上=eoa
)
字符串类似于一个称为转义和保留字符的概念。例如,可以是字符串的结尾,而ESCAPE=
\x7d
是保留的。然后组合逃逸-!EOS是字符串中的EOS,ESC-!ESC是字符串中的ESC。该字符串有一个EOS=\x00
和一个不能发生的规则,因此不需要转义。转义有一个缺点,即数据大小与表示的大小不同(一些数据占用两个字节,而另一些只占用一个字节)。如果字符串是Unicode(UTF8、UTF16等),也会出现这种情况。之所以使用这种情况,是因为字符串是由字节而不是单词组成的。显然字节数组也是。所以它只是将字符串/数组逐字节加载到R2中?是的,这是正确的。使用调试器/模拟器亲自查看。最后一部分并非特定于ARM/assembler。这是一个数据结构问题。每个数据结构通常都有权衡。有很多方法可以表示文本或字节。这个例子似乎有点混淆了两者ldr r0,=eoa
是一个变量,实际添加数据。如果这两种数据结构明确说明了数据的大小,那么你的教授会通过示例更公正地解释这两种数据结构。