LC-3:BLKW可以指定存储数据的位置?

问题描述 投票:0回答:1

在LC-3中,当您使用BLKW时,如何将内存块初始化为位置x3102,而不是下一个可用的内存位置?

memory store lc3
1个回答
0
投票

首先,让我们注意一下,根据内存映射(例如,至少在x3000-xFDFF范围内),您可以使用16位地址空间的所有内存,并将其初始化为零;您可以随意使用它。

通常来说,LC-3汇编器不允许在整个文件中使用多个.ORIG指令,相反,它们在文件的开头需要一个。如果它们确实允许使用后续的.ORIG指令,则这将是完成您所要求的方法。

但是即使经常这样做,我们也会遇到指令偏移量编码的限制。因此,下面将显示一个替代解决方案。

但是首先,让我们看一下指令偏移量/立即编码的限制。

通常的数据存储器访问指令格式具有非常有限的偏移量,仅值9位(+/-大约256),并且该偏移量是pc相对的。因此,例如,以下操作无效:

      .ORIG x3000

      LEA R0, TESTA
      LD R1, TESTA

      LEA R2, TESTB         ; will get an error due to instruction offset encoding limitation
      LD R3, TESTB          ; will get an error due to instruction offset encoding limitation

      HALT

    TESTA
      .FILL #1234

      .BLKW xFA             ; exactly enough padding to relocate TESTB to x3100

    TESTB
       .FILL #4321          ; which we can initialize with a non-zero value

      .END

此示例:虽然这将成功地将TESTB放置在x3100上,但由于9位pc相对位移有限,所以LEALD指令都无法达到它。

.BLKW操作数必须缩小大小,这显然很痛苦-通过在其中支持.ORIG指令可以消除此方面。)] >因此,大块等的替代方法是求助于使用零初始化的内存,并使用附近的指针变量引用该其他内存:使用LD加载地址,而不是LEA和[C0 ]访问一个值而不是LDI

LD

在上面的后者中,没有声明要在      .ORIG x3000

      LEA R0, TESTA
      LD R1, TESTA

      LD R2, TESTBRef       ; will put x3100 into R3
      LDI R3, TESTBRef      ; will access the memory value at address x3100..

      HALT

    TESTA
      .FILL #1234

    TESTBRef                ; a nearby data pointer, that points using the full 16-bits
      .FILL x3100

      .END
处保留存储,也不能使用非零初始化(例如,没有字符串,没有预定义的数组)在x3100处初始化该存储。

使用数据到数据指针,x3100。与代码对代码/数据引用(即

instructions

引用代码或数据)不同,数据对代码/数据(即data引用代码或数据)指针具有全部16位可用于指向。因此,一旦我们使用这种方法,简单地使用其他内存,就放弃了将标签自动放置在其他标签之后(对于那些其他区域),也放弃了非零初始化。


某些LC-3汇编器将允许多个文件,并且每个都允许使用自己的TESTBRef指令-因此,通过使用多个文件,我们可以将代码和数据放置在地址空间中的不同位置。但是,代码到数据指令的偏移编码限制仍然适用,因此,您可能最终还是要手动管理其他此类存储区,并同时使用数据指针。


请注意,JSR指令的偏移量为11位,因此代码对代码的引用比代码对数据的引用更远。
© www.soinside.com 2019 - 2024. All rights reserved.