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中。 |