【问题标题】:How do I access each word in Assembly?如何访问 Assembly 中的每个单词?
【发布时间】:2012-11-30 21:30:01
【问题描述】:

给定:

.data
arr: .word 2,5,1,3,4
len: .word 5
sum: .word 0

如何访问“arr”中的每个单词,例如 2、3 和 4?

最终,我想做的是找到“arr”中所有值的总和,但我在遍历“arr”时遇到了困难。

感谢您的宝贵时间!

附加信息:

  1. 我正在使用 eduMIPS64

【问题讨论】:

  • 您可能想提供有关此问题上下文的更多详细信息。 CPU、汇编程序等会有所帮助。
  • @JoshuaBerry 大概是 x86 程序集。在主流中使用的其他类型并不多。
  • @Liam 我的猜测是 ARM 和嵌入式 PIC 系统的数量超过了 x86。
  • @JoshuaBerry 抱歉,我对此完全陌生。我正在使用 eduMIPS64...我不太确定还有哪些信息会有所帮助。

标签: arrays assembly word mips64 edumips64


【解决方案1】:

首先将数组的地址加载到寄存器中,然后您可以访问具有恒定偏移量的项目。 (您的汇编器可能支持诸如lw $t0, arr+12 之类的结构作为方便的简写。请参阅您的手册。)对于迭代,要么增加地址寄存器,要么添加另一个包含偏移量的寄存器。请务必考虑项目大小。以下示例适用于 32 位 mips,根据需要调整 64 位:

.data
arr: .word 2,5,1,3,4
len: .word 5
sum: .word 0

.text
.globl main
main:
    la $t0, arr
    lw $t1, 12($t0)     # load arr[3] using byte offset
    li $t1, 3           # index
    sll $t1, $t1, 2     # multiply by item size
    addu $t1, $t1, $t0  # add base address
    lw $t1, ($t1)       # load arr[3]

# iteration type 1
# for(i=len, ptr=arr; i != 0; i -= 1, ptr += 1)
# ... use *ptr ...
    la $t0, arr
    lw $t1, len         # load length
loop1:
    lw $t2, ($t0)       # load item
    # process item here
    addi $t0, $t0, 4    # add item size to pointer
    addi $t1, $t1, -1   # decrement counter
    bne $t1, $0, loop1  # if counter != 0, repeat

# iteration type 2
# for(i=0, i != len; i += 1)
# ... use arr[i] ...
    la $t0, arr
    lw $t1, len         # load length
    li $t2, 0           # index
loop2:
    sll $t3, $t2, 2     # multiply by item size
    addu $t3, $t3, $t0  # add base address
    lw $t3, ($t3)       # load item
    # process item here
    addi $t2, $t2, 1    # increment index
    bne $t2, $t1, loop2 # if index != len, repeat

(注意这些示例循环不处理零长度数组,必要时添加检查)

【讨论】:

  • 哇,这很全面。感谢您花时间解释这一点!
  • 我有一个问题,当我增加索引时,“arr”的值存储在地址 0、8、10、18、20、28、30 等中。为什么间距为 8 和 2?为什么不简单地增加一个单词的大小?
  • 你的数字是十六进制的吗? ;)
  • T_T,这是有道理的,不是吗。感谢您对我的包容!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2016-03-17
  • 2021-10-28
  • 2012-04-21
相关资源
最近更新 更多