store-word ( sw
) 指令的语法是
sw rs2, offset(rs1)
其中 offset 是 12 位立即数操作数。
当您编写时,sw a1, num
您会收到语法错误,并且汇编程序失败并显示:
foo.s: : Assembler messages:
foo.s::13: Error: illegal operands `sw a1,num'
也许解决这个问题的最简单方法是使用load-address ( la
) 伪指令:
li a1, 100
la t0, num
sw a1, 0(t0)
由于la
指令将地址完全加载到寄存器中,我们必须将其0
用作偏移量。
la
伪指令扩展为程序计数器(PC)相对寻址,即检查objdump
:
00000000000100b0 <_start>:
100b0: 06400593 addi a1,zero,100
100b4: 00001297 auipc t0,0x1
100b8: 01028293 addi t0,t0,16 # 110c4 <__DATA_BEGIN__>
100bc: 00b2a023 sw a1,0(t0)
或者,您可以使用绝对寻址:
li a1, 100
lui t0, %hi(num)
sw a1, %lo(num)(t0)
请注意,宏%hi()
和%lo()
汇编器宏将 32 位地址分成高 20 位和低 12 位部分(即%hi(num) + sign_ext(%lo(num)) = num
)。