【发布时间】:2019-04-26 03:24:03
【问题描述】:
我必须在 AVR 程序集中编写一个程序,该程序在被 C 程序调用时接收一个指向整数数组的指针,并对其元素执行操作而不实际输出值。为简单起见,假设我希望我的程序将每个元素的值加倍 - 这样给定数组 {2, 4, 6, 8},在 C 中调用打印方法与我编写的内容分开将打印 {4, 8, 12, 16}。
我的问题是我不明白如何更改数组元素的值,并在函数执行完成后让这些更改持续存在。我无法通过寄存器r24 返回任何内容,因为我需要为不同的目的返回不同的数字。
我的想法是,由于寄存器r24 上的输入作为指向数组第一个元素的指针,我将mov r26 r24,关联(?)数组与X 指针,然后ld到另一个寄存器,这样我就可以使用 X 指针在数组中递增,如ld r18, X+。
虽然我在导航数组时遇到了一点麻烦,但我不明白如何让我的更改持久化,如果这有意义的话。我的印象是我应该使用st 和/或sts 来解决这个问题,但我很难理解它们是如何工作的。我的尝试是保留一个像 Z 这样的指针与输入数组相关联,每次我准备好一个值来替换数组中的旧元素时,我都会写 st Z+, rXX,将值放在索引 Z 处,然后指向到下一个索引。这不起作用,所以我想知道:我需要做什么才能将本地寄存器的内存与提供给程序的输入的内存链接起来?
【问题讨论】:
-
I don't understand how to give my changes permanence, if that makes sense- 这听起来很奇怪。您的数组在内存中,位于顺序地址。您将指针传递给起始地址并用新值覆盖此内存的内容 - 可以比这更永久。 :) 值得指定您使用的 C 编译器,因为您需要了解编译器特定的“调用约定”。而且,如果有疑问,您总是可以用 C 而不是 asm 来实现您的函数,并查看编译器生成了什么。 -
This didn't work, so I'm left wondering- 好吧,因为这实际上几乎没有告诉我们什么,所以总是建议显示实际代码(通过复制并粘贴到问题正文中,使用Edit)因为你听起来像一个很少体验可能有几十个原因导致某些事情对你不起作用,没有意义的猜测。还请指定您正在编程的确切芯片(或者如果您使用的是仿真器)。since the input on register r24- 我对 AVR 没有经验,但指针是 16 位的,不是吗?不能通过 r24
标签: arrays assembly ld avr cpu-registers