计算机编程中的基础概念与实例分析
1. MIPS 特定细节
在 MIPS 架构中,所有指令都是 32 位的,这就导致无法将一个 32 位常量嵌入到一条指令中。例如下面这个简单的函数:
unsigned int f()
{
return 0x12345678;
};
这个函数要返回一个 32 位常量,需要至少两条指令来实现。第一条指令加载 32 位数字的高 16 位,第二条指令执行 OR 操作,从而设置目标寄存器的低 16 位。以下是 GCC 4.4.5 -O3 的汇编输出:
li $2,305397760 # 0x12340000
j $31
ori $2,$2,0x5678 ; branch delay slot
IDA 工具能够识别这种常见的代码模式,为了方便显示,它会把最后一条 ORI 指令显示为 LI 伪指令,该伪指令可以将一个完整的 32 位数字加载到 $V0 寄存器中。GCC 汇编输出中的 LI 伪指令,实际上对应的是 LUI(“Load Upper Imeddiate”)指令,它将一个 16 位的值存储到寄存器的高 16 位。
2. 有符号数的表示
计算机中有多种表示有符号数的方法,其中“补码”是最常用的一种。以下是一些字节值的二进制、十六进制、无符号和有符号(补码)表示的对应关系表格:
| 二进制 | 十六进制 | 无符号 | 有符号(2 的补码) |
| ---- | ---- | --
超级会员免费看
订阅专栏 解锁全文
5万+

被折叠的 条评论
为什么被折叠?



