MIPS指令中无符号与有符号数处理的技术问询
MIPS汇编:add类指令与加载指令的有符号/无符号处理
一、add类指令的核心逻辑
MIPS的add类指令运算的二进制逻辑完全一致,区别仅在于是否触发溢出异常,而非专门“处理”有符号或无符号数:
add:有符号加法,会检查溢出。若两个有符号数相加结果超出32位有符号数范围(-2³¹ ~ 2³¹-1),触发溢出异常。addi:有符号立即数加法,检查溢出。立即数会被符号扩展为32位有符号数后运算,溢出则触发异常。addu:无溢出检查的加法(这里的U是Unchecked,不是Unsigned)。运算逻辑和add相同,但无论结果是否溢出都不触发异常。你可以用它处理无符号数,也可以处理有符号数——溢出判断由程序员自行负责。addiu:无溢出检查的立即数加法。立即数会被符号扩展为32位,运算后不检查溢出。同样可用于有符号或无符号场景,核心是不触发溢出异常。
二、LBU与LHU的扩展规则
当从内存加载字节(8位)或半字(16位)到32位寄存器时,需要将数据扩展到32位,分为两种规则:
lbu(Load Byte Unsigned):加载字节后执行零扩展。无论原字节的最高位是什么,高位都补0,得到32位无符号数。例如加载字节0xFF,扩展后为0x000000FF(十进制255)。lhu(Load Halfword Unsigned):加载半字后执行零扩展。例如加载半字0xFFFF,扩展后为0x0000FFFF(十进制65535)。
注意:处理有符号数的是lb和lh指令——它们会执行符号扩展:若原数据最高位为1(负数),高位补1;最高位为0(正数),高位补0。比如lb加载0xFF,扩展后为0xFFFFFFFF(十进制-1,作为有符号数)。
内容的提问来源于stack exchange,提问作者user23145020
相关产品推荐
相关产品推荐

