使用lwc1指令向CP1寄存器加载数值时触发地址越界错误求助
MIPS汇编lwc1指令地址越界问题解决
问题原因
你用lwc1 $f6, 20出错的核心原因是:lwc1是从内存地址加载数据到CP1浮点寄存器的指令,它的第二个操作数是内存地址(或基于基址寄存器的偏移),不是立即数。你想加载数值20,但代码里的20会被CPU解析为内存地址0x00000014,这个地址不在程序的合法内存空间内,因此触发"address out of range"错误。
正确实现方法
如果要把数值20以浮点形式加载到$f6寄存器,有两种可靠方式:
方法1:通过通用寄存器中转(适合临时生成浮点数)
先把整数20加载到通用寄存器,再转移到CP1寄存器并转换为浮点格式:
li $t0, 20 # 将整数20加载到通用寄存器$t0 mtc1 $t0, $f6 # 把$t0的内容转移到CP1的$f6寄存器 cvt.s.w $f6, $f6 # 将整数格式转换为单精度浮点数(若需要浮点比较必须执行此步)
方法2:在数据段定义常量后加载(适合固定浮点数)
先在.data段定义单精度浮点数20.0,再用lwc1从内存加载:
.data float_const: .float 20.0 # 定义单精度浮点数常量 .text lwc1 $f6, float_const # 从内存地址float_const加载数据到$f6
补充说明
如果你的需求是整数比较,不需要用浮点寄存器,直接用通用寄存器和整数比较指令(比如bgt、beq)即可;如果必须用浮点寄存器做比较,一定要确保$f6中的数据是浮点格式,否则比较结果会出错。
内容的提问来源于stack exchange,提问作者Tyxe
相关产品推荐
相关产品推荐

