有没有一条LC3指令可以将一个值加载到寄存器中?我需要写一些汇编代码,我需要写一条指令来将值1存储在R1中。
s4n0splo1#
LD R1, value
字符串在“value”上用.fill填充你想加载到R1中的任何值。我不相信有一种方法可以用单行将一个字面值加载到寄存器中,但是你可以用一条指令和一个标签来完成。
olmpazwi2#
是的,它是:LD R0,Param1这意味着它会将Param1的值加载到寄存器0中。
62lalag43#
LC-3没有移动立即数。The instruction set包括AND/ADD/NOT(带寄存器或立即数)、莱亚和加载指令。
add
如果有一个置零寄存器,则可以将任何小常数具体化为add(5位符号扩展立即数,值范围[-16, +15])寄存器。(零是特殊的:它可以通过AND创建,而不管以前的寄存器内容如何。)
[-16, +15]
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范围内的期望值都可以工作。例如,如果你知道R4是3,你可以用add r1, r4, #-3 + 1得到R1=1。但是这很复杂,只有当你优化大小或速度时才值得这样做。
R4
3
add r1, r4, #-3 + 1
ld使用PC相对寻址模式,因此可以加载附近的字(-256..+255)。
ld
ld r1, ONE ONE .fill 1 ; elsewhere in your program
型如果你需要在程序中的不同位置使用几个简单的常量,并且不想让你宝贵的几个寄存器中的一个一直为零,这是一种不需要任何设置就可以获得常量的单指令方法。
如果你只想从函数中返回0或非0,你可能不关心你创建的是哪个非零值。and只能清除位,而不能设置它们。如果你不知道任何寄存器的值,add和not也不安全;总是有一个输入,将导致0为他们。例如,add r0, r1, #1 Package 为0,如果原始值是0xFFFF又名-1。但莱亚可以创建一个仅取决于程序计数器的值(已知)和指令中的9位有符号立即数([-256..+255]范围)。我们知道地址0不会在我们程序的中间,所以如果我们只想要非0的地址,任何地址都可以。通常我们开始LC-3程序在.orig x3000,所以像1这样的小数字不能由莱亚生成,但如果我们只需要非0,那就可以了。
and
not
0
add r0, r1, #1
-1
.orig x3000
1
.orig x3000 ... lea r0, nonzero ... nonzero ; put this label literally anywhere in your program var1 .fill 1
型nonzero标签被附加到与var1相同的地址,这完全没有问题。
nonzero
var1
nonzero lea r0, nonzero
型如果您可以使用.orig将您的程序放在靠近内存地址空间的开始处,那么可以使用莱亚创建像1这样的小常量。
.orig
.orig 0 address0 ... lea r1, address0+1 ; R1 = 1, if this is the right syntax for this ...
型
3条答案
按热度按时间s4n0splo1#
字符串
在“value”上用.fill填充你想加载到R1中的任何值。我不相信有一种方法可以用单行将一个字面值加载到寄存器中,但是你可以用一条指令和一个标签来完成。
olmpazwi2#
是的,它是:LD R0,Param1
这意味着它会将Param1的值加载到寄存器0中。
62lalag43#
LC-3没有移动立即数。The instruction set包括AND/ADD/NOT(带寄存器或立即数)、莱亚和加载指令。
使用
add
-immediate和置零寄存器如果有一个置零寄存器,则可以将任何小常数具体化为
add
(5位符号扩展立即数,值范围[-16, +15]
)寄存器。(零是特殊的:它可以通过AND创建,而不管以前的寄存器内容如何。)
字符串
源寄存器并不 * 必须 * 为零;任何其他已知的常数在-16..+15范围内的期望值都可以工作。例如,如果你知道
R4
是3
,你可以用add r1, r4, #-3 + 1
得到R1=1。但是这很复杂,只有当你优化大小或速度时才值得这样做。从静态存储中加载值
ld
使用PC相对寻址模式,因此可以加载附近的字(-256..+255)。型
如果你需要在程序中的不同位置使用几个简单的常量,并且不想让你宝贵的几个寄存器中的一个一直为零,这是一种不需要任何设置就可以获得常量的单指令方法。
创建非零值的莱亚
如果你只想从函数中返回0或非0,你可能不关心你创建的是哪个非零值。
and
只能清除位,而不能设置它们。如果你不知道任何寄存器的值,add
和not
也不安全;总是有一个输入,将导致0
为他们。例如,add r0, r1, #1
Package 为0,如果原始值是0xFFFF又名-1
。但莱亚可以创建一个仅取决于程序计数器的值(已知)和指令中的9位有符号立即数([-256..+255]范围)。我们知道地址
0
不会在我们程序的中间,所以如果我们只想要非0的地址,任何地址都可以。通常我们开始LC-3程序在.orig x3000
,所以像1
这样的小数字不能由莱亚生成,但如果我们只需要非0,那就可以了。型
nonzero
标签被附加到与var1
相同的地址,这完全没有问题。型
如果您可以使用
.orig
将您的程序放在靠近内存地址空间的开始处,那么可以使用莱亚创建像1
这样的小常量。型