Skip to content

LA32R汇编编程简介

LA32R汇编器支持的伪指令汇总

转移类

伪指令 对应的真实指令(序列) 描述
jr $rx jirl $r0, rx, 0 将通用寄存器 rx 中的值作为跳转目标地址,无条件跳转到目标地址处。
bgt $rx, $ry, label blt $ry, $rx, label 将通用寄存器 rx 和通用寄存器 ry 的值视作有符号数进行比较,如果前者大于后者则跳转到目标地址,否则不跳转。
bgtu $rx, $ry, label bltu $ry, $rx, label 将通用寄存器 rx 和通用寄存器 ry 的值视作无符号数进行比较,如果前者大于后者则跳转到目标地址,否则不跳转。
ble $rx, $ry, label bge $ry, $rx, label 通用寄存器 rx 和通用寄存器 ry 的值视作有符号数进行比较,如果前者小于等于后者则跳转到目标地址,否则不跳转。
bleu $rx, $ry, label bgeu $ry, $rx, label 通用寄存器 rx 和通用寄存器 ry 的值视作无符号数进行比较,如果前者小于等于后者则跳转到目标地址,否则不跳转。
bltz $rx, label blt $rx, $r0, label 通用寄存器 rx 的值视作有符号数与0进行比较,如果rx小于0则跳转到目标地址,否则不跳转。
bgtz $rx, label blt $r0, $rx, label 通用寄存器 rx 的值视作有符号数与0进行比较,如果rx大于0则跳转到目标地址,否则不跳转。
blez $rx, label bge $r0, $rx, label 通用寄存器 rx 的值视作有符号数与0进行比较,如果rx小于等于0则跳转到目标地址,否则不跳转。
bgez $rx, label bge $rx, $r0, label 通用寄存器 rx 的值视作有符号数与0进行比较,如果rx大于等于0则跳转到目标地址,否则不跳转。

运算类

伪指令 对应的真实指令(序列) 描述
li.w $rx, imm imm取值范围产生相应的指令(序列) 将立即数imm写入通用寄存器rx中。
move $rx, $ry or $rx, $ry, $r0 将通用寄存器ry的值写入通用寄存器rx中。
nop addi $r0, $r0, 0 空指令

加载地址

伪指令 对应的真实指令(序列) 描述
la $rx, label(+addend) 与la.global $rx, label(+addend)一致 label(+addend)的地址写入通用寄存器rx中。
la.local $rx, label(+addend) lu12i.w $rx, abs(l_a)>>12;
ori $rx, $rx, abs(l_a)&0xfff
其中l_a表示label(+addend),abs表示绝对地址,下同;适用于使用编译选项-Wa, -mla-local-with-abs的情况,将label(+addend)的地址写入通用寄存器rx中。
la.local $rx, label(+addend) pcaddu12i $rx, pcrel(l_a+0x800)<<32>>44;
addi.w $rx, $rx, pcrel(l_a+4)-(pcrel(l_a+4+0x800)>>12<<12);
其中pcrel表示与PC地址的相对偏移,下同;适用于不额外使用编译选项的情况,将label(+addend)的地址写入通用寄存器rx中。
la.global $rx, label(+addend) pcaddu12i $rx, pcrel(l_a+0x800)<<32>>44;
addi.w $rx, $rx, pcrel(l_a+4)-(pcrel(l_a+4+0x800)>>12<<12);
适用于使用编译选项-Wa, -mla-global-with-pcrel的情况,将label(+addend)的地址写入通用寄存器rx中。
la.global $rx, label(+addend) lu12i.w $rx, abs(l_a)>>12;
ori $rx, $rx, abs(l_a)&0xfff;
适用于使用编译选项-Wa, -mla-global-with-abs的情况,将label(+addend)的地址写入通用寄存器rx中。
la.got $rx, label pcaddu12i $rx, (pcrel(_GOT_+0x800)+gprel(label))<<32>>44;
ld.w $rx, $rx, pcrel(_GOT_+4)+gprel(label)-((pcrel(_GOT_+4+0x800)+gprel(label))>>12<<12);
其中_GOT_表示符号_GLOBAL_OFFSET_TABLE_,代表GOT基址; gprel表示相对GOT偏移,下同;借助GOT将label的地址写入通用寄存器rx中。
la.pcrel $rx, label(+addend) pcaddu12i $rx, pcrel(l_a+0x800)<<32>>44;
addi.w $rx, $rx, pcrel(l_a+4)-(pcrel(l_a+4+0x800)>>12<<12);
借助PC相对偏移将label(+addend)的地址写入通用寄存器rx中。
la.abs $rx, label(+addend) lu12i.w $rx, abs(l_a)>>12;
ori $rx, $rx, abs(l_a)&0xfff;
借助绝对地址将label(+addend)的地址写入通用寄存器rx中。
la.tls.le $rx, label(+addend) lu12i.w $rx, tprel(l_a)>>12;
ori $rx, $rx, tprel(l_a)&0xfff
存储(TLS)通过tp偏移将label地址写入通用寄存器rx中。
la.tls.ie $rx, label pcaddu12i $rx, (pcrel(_GOT_+0x800)+tlsgot(label))<<32>>44;
ld.w $rx, $rx, pcrel(_GOT_+4)+tlsgot(label)-((pcrel(_GOT_+4+0x800)+tlsgot(label))>>12<<12);
存储(TLS)通过tlsgot表机制将label地址写入通用寄存器rx中。
la.tls.ld $rx, label pcaddu12i $rx, (pcrel(_GOT_+0x800)+tlsgd(label))<<32>>44;
addi.w $rx, $rx, pcrel(_GOT_+4)+tlsgd(label)-((pcrel(_GOT_+4+0x800)+tlsgd(label))>>12<<12);
存储(TLS)通过tlsld机制(目前使用的是tlsgd)将label地址写入通用寄存器rx中。
la.tls.gd $rx, label pcaddu12i $rx, (pcrel(_GOT_+0x800)+tlsgd(label))<<32>>44;
addi.w $rx, $rx, pcrel(_GOT_+4)+tlsgd(label)-((pcrel(_GOT_+4+0x800)+tlsgd(label))>>12<<12);
存储(TLS)通过tlsgd机制将label地址写入通用寄存器rx中。