疑问:RISC-V指令addi sp,sp,-32为何被转换为二进制码11 01?
RISC-V addi指令编码解析
先明确RISC-V的I型指令编码格式(32位),从高位到低位依次是:
- 12位立即数
imm[11:0] - 5位源寄存器
rs1 - 3位功能码
funct3 - 5位目标寄存器
rd - 7位操作码
opcode
对于addi指令,固定参数:
opcode=0010011(二进制)funct3=000(二进制)- 寄存器
sp是x2,对应二进制00010,所以rs1和rd都是00010
1. 解析addi sp, sp, -40的编码
- 立即数
-40的12位补码计算:40的十六进制是0x28,12位补码为0x1000 - 0x28 = 0xfd8,对应二进制110111111000 - 按I型格式拼接32位二进制:
110111111000 00010 000 00010 0010011 - 分组转十六进制(每4位一组):
1101 1111 1000 0001 0000 0001 0001 0011→0xfd810113,和你给出的结果一致。
2. 解析addi sp, sp, -32的编码
- 立即数
-32的12位补码计算:32的十六进制是0x20,12位补码为0x1000 - 0x20 = 0xfe0,对应二进制111111100000 - 按I型格式拼接32位二进制:
111111100000 00010 000 00010 0010011 - 转十六进制为
0xfe010113,对应的完整二进制是32位,并非11 01。
你提到的11 01应该是对编码的误解:参考图片显示的反汇编结果包含指令与对应机器码,机器码0xfe010113的十六进制字节拆分是0xfe、0x01、0x01、0x13,若误提取其中片段,可能会得到类似11 01的不完整二进制内容。
内容的提问来源于stack exchange,提问作者Chris633
相关产品推荐
相关产品推荐

