assembly 将值加载到LC 3中的寄存器中

vof42yt1  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(109)

有没有一条LC3指令可以将一个值加载到寄存器中?我需要写一些汇编代码,我需要写一条指令来将值1存储在R1中。

s4n0splo

s4n0splo1#

LD R1, value

字符串
在“value”上用.fill填充你想加载到R1中的任何值。我不相信有一种方法可以用单行将一个字面值加载到寄存器中,但是你可以用一条指令和一个标签来完成。

olmpazwi

olmpazwi2#

是的,它是:LD R0,Param1
这意味着它会将Param1的值加载到寄存器0中。

62lalag4

62lalag43#

LC-3没有移动立即数。The instruction set包括AND/ADD/NOT(带寄存器或立即数)、莱亚和加载指令。

使用add-immediate和置零寄存器

如果有一个置零寄存器,则可以将任何小常数具体化为add(5位符号扩展立即数,值范围[-16, +15])寄存器。
零是特殊的:它可以通过AND创建,而不管以前的寄存器内容如何。)

and  r7, r7, #0        ; R7 = 0.  Somewhere in your program or function

 add  r0, r7, #-16      ; R0 = 0 + -16 = -16
 add  r1, r7, #15       ; R1 = 15

字符串
源寄存器并不 * 必须 * 为零;任何其他已知的常数在-16..+15范围内的期望值都可以工作。例如,如果你知道R43,你可以用add r1, r4, #-3 + 1得到R1=1。但是这很复杂,只有当你优化大小或速度时才值得这样做。

从静态存储中加载值

ld使用PC相对寻址模式,因此可以加载附近的字(-256..+255)。

ld r1, ONE

ONE .fill 1        ; elsewhere in your program


如果你需要在程序中的不同位置使用几个简单的常量,并且不想让你宝贵的几个寄存器中的一个一直为零,这是一种不需要任何设置就可以获得常量的单指令方法。

创建非零值的莱亚

如果你只想从函数中返回0或非0,你可能不关心你创建的是哪个非零值。and只能清除位,而不能设置它们。如果你不知道任何寄存器的值,addnot也不安全;总是有一个输入,将导致0为他们。例如,add r0, r1, #1 Package 为0,如果原始值是0xFFFF又名-1
但莱亚可以创建一个仅取决于程序计数器的值(已知)和指令中的9位有符号立即数([-256..+255]范围)。我们知道地址0不会在我们程序的中间,所以如果我们只想要非0的地址,任何地址都可以。通常我们开始LC-3程序在.orig x3000,所以像1这样的小数字不能由莱亚生成,但如果我们只需要非0,那就可以了。

.orig x3000

...
 lea r0, nonzero
...

nonzero       ; put this label literally anywhere in your program
var1   .fill 1


nonzero标签被附加到与var1相同的地址,这完全没有问题。

nonzero  lea r0, nonzero


如果您可以使用.orig将您的程序放在靠近内存地址空间的开始处,那么可以使用莱亚创建像1这样的小常量。

.orig  0
address0

...

  lea r1, address0+1       ; R1 = 1, if this is the right syntax for this

...

相关问题