A64指令集如何将64位的数值写入通用寄存器

A64指令集中,mov编码里的立即数为16位。ATF中,通过宏定义,使得可以通过 mov_imm reg, imm的形式向通用寄存器中写入32bit或64bit的值。

	.macro mov_imm _reg, _val
		.if (\_val) == 0
			mov	\_reg, #0
		.else
			_mov_imm16	\_reg, (\_val), 0
			_mov_imm16	\_reg, (\_val), 16
			_mov_imm16	\_reg, (\_val), 32
			_mov_imm16	\_reg, (\_val), 48
		.endif
	.endm
	
	.macro _mov_imm16 _reg, _val, _shift
		.if (\_val >> \_shift) & 0xffff        
			.if (\_val & (1 << \_shift - 1))
				movk	\_reg, (\_val >> \_shift) & 0xffff, LSL \_shift
			.else
				mov	\_reg, \_val & (0xffff << \_shift)
			.endif
		.endif
	.endm

mov指令和movk指令的区别:mov指令会先将最后的值初始化为0,再在基础上加值;movk指令不会影响原先寄存器内的值。

故通过一次mov指令和多次movk指令,可以mov大于16位的立即数

你可能感兴趣的:(assembly,arm)