assembly - 带有数组和字符串的 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
解决方案
我不知道为什么要使用它,无论是特定于数组和字符串的东西还是正确的语法……我将非常感谢我想理解的解释。
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
与=arr
plus相比=eoa
)。
该字符串类似于称为转义字符和保留字符的通信协议概念。例如,字符 EOS=\x7e
可能是字符串的结尾,而 ESCAPE=\x7d
是保留的。那么 ESCAPE-!EOS 的组合是字符串中的一个 EOS,而 ESC-!ESC 是字符串中的一个 ESC。该字符串有一个 EOS=\x00
和一个不能发生的规则,因此不需要转义。转义有一个缺点,即数据大小与表示的大小不同(一些数据占用两个字节,而另一些只占用一个字节)。如果字符串是 Unicode(UTF8、UTF16 等)也是如此。
推荐阅读
- sql - 如何在 SQL 中根据条件显示查询?
- influxdb - 如何使用 Flux 根据结果表中的不同行转换 InfluxDB GROUP 结果
- javascript - 基于复选框的 JavaScript 切换 DIV
- sql - 查询中的重复结果
- python - 以编程方式启动 Google 应用引擎实例
- android - 关于 RecycleView.Adapter 的一般问题
- python - Pandas Python 使用条件从列表中删除元素
- html - 如何删除部分上的多余空格
- html - Element.Click 打开第一项但不是第二项
- assembly - 在 LMC 中打印给定数字的所有数字