【问题标题】:How do I copy an array into another array?如何将一个数组复制到另一个数组中?
【发布时间】:2021-02-16 19:39:41
【问题描述】:

我刚开始学习汇编,我很难理解如何将一个数组复制到另一个数组中。

例如,假设我有 2 个数组 J 和 K:

J 和 K 都包含 5 个元素,它们是 8 位宽的数字。

J = [0, 1, 2, 3, 4]
K = [5, 6, 7, 8, 9]

J 位于寄存器 1,K 位于寄存器 2

我将如何将 J“附加”/“复制”到 K? (如果这是正确的思考方式)

会不会是:

LDR R3, R1[0] ; placing 0th J element into register R3
MOV R2, R3 ; Moving the R3 element into the array K
....
....
....

这样继续,直到所有元素都被复制到数组 K 中

所以我试图获得的结果是一个数组,其中包含两个初始数组中的元素 result = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我确信这是完全错误的,所以如果有人能够为我阐明这一点,将不胜感激!

【问题讨论】:

  • 您需要STR 才能写入内存。既然你说你有 8 位宽的项目,你应该使用 LDRBSTRB。此外,您还需要确保数组中有足够的空间,并且显然将元素写入正确的地址。
  • 数组有固定的大小,除非你的意思是K 之前有空闲空间,你实际上并没有算作最初的 5 个元素的一部分。在 C 语言中,想想memcpy(K, J, 5) 会为uint8_t J[5], K[5]; 做什么

标签: arrays assembly arm


【解决方案1】:

这绝对可以在汇编中完成,但由于以下几个原因很难:

  1. 您需要知道数组的位置,并确保在尝试复制它们时不会覆盖任何重要的内容。例如,假设您只想将 K 直接复制到 J 后面。如果其他重要的东西存储在 J 后面,那么它将被删除!
  2. 每个阵列有多大?这对你和我来说都很明显,但计算机并没有真正的线索。您有两个选择:自己测量或提前知道数组大小。
  3. 您需要为每种数据类型设置不同的例程。

对于这个示例代码,我假设您希望将附加的数组 J+K 放置在不会覆盖您正在使用的任何内容的单独内存部分中。此代码还假定两个数组大小均为 5 个字节。这并不是特别有用,因为您可能希望您的代码能够处理各种大小的数组,而不仅仅是这一特定大小。

    LDR R2,=ARRAY_J
    LDR R3,=ARRAY_K
    LDR R4,=ARRAY_L

    MOV R1,#5         @ size of ARRAY_J goes here.

loop_append_J:
    LDRB R0,[R2],#1    @ load R0 from ARRAY_J, add 1 to the pointer so we read the 
                       @ next byte on the next pass.

    STRB R0,[R4],#1    @ store R0 into ARRAY_L (ARRAY J + ARRAY K), add 1 to the 
                       @ pointer

    SUBS R1,R1,#1      @ decrease loop counter and set the flags accordingly
    BNE loop_append_J  @ if R1 doesn't equal zero, loop again.

    MOV R1,#5          @ size of ARRAY_K goes here

loop_append_K:
    LDRB R0,[R3],#1    @ this is pretty much the same story, just with the second 
                       @ array. R4 already points to where it needs to.
 
    STRB R0,[R4],#1
    SUBS R1,R1,#1
    BNE loop_append_K

@ now your program is done, do whatever you need to do to return, be it BX LR or whatever

.data                 @ forgive me if the syntax is wrong, I'm used to VASM which doesn't 
                      @ have data directives like this.
ARRAY_J: 
   .byte 0,1,2,3,4    @whatever directive you use to define 8-bit values
ARRAY_K:
   .byte 5,6,7,8,9    @whatever directive you use to define 8-bit values

  
ARRAY_L:              @empty space to hold the new array.
   .space 64,0        @this is more than enough room to store the new array.


【讨论】:

    猜你喜欢
    • 2022-07-05
    • 2013-06-05
    • 2012-01-07
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2014-08-24
    • 2013-05-28
    相关资源
    最近更新 更多