信息的表示与处理
信息储存
大小端序
x86 x64采取小端序,低字节存放 低位。
常见的ARM采取大端序,低字节存放高位。
整数表示
无符号
有符号(补码)
有无符号转换
int x;
IEEE浮点数
float=1Sign+9Exp+23Frac
double=1Sign+11Exp+52Frac
s为符号,M称为尾数,E称为阶码。
1.规格化的值
当Exp即非全1,也非全0时,浮点数表示一个规格化的值。
此时,
,其中
Frac被解释为小数,那么
2.非规格化的值
当Exp为全0时,浮点数表示非规格化的值,此时
3.特殊值
当Exp为全1时,浮点数表示一些特殊值。
如果Frac全为0,表示无穷,即
其它时候,float表示的值被称为NaN(Not a Number)
信息处理
移位运算
左移
总在右侧补0。
算术右移
根据需求补0或补1,实现
的期待算术功能。
逻辑右移
总在左侧补0,实现逻辑功能。
位扩展
零扩展
对于无符号数,我们只需要简单地在左侧补零即可。
符号扩展
根据符号左侧补0或补1,这样可以保证有符号数的值不变。
截断数字
无符号数截断
无符号数直接截断。
有符号数截断
有符号数先转化为无符号数,截断后再转换回来。
整数加法
无符号加法
无符号加法逆元
补码加法
补码加法逆元
整数乘法
无符号乘法
补码乘法
补码乘法和无符号乘法在位级是等价的。
浮点数的舍入
IEEE浮点数采取向偶数舍入的方式,自动向最接近的值舍入,即
待社区的部分低于新的最低位的一半时舍去,大于时则进位;
如果恰好等于最低位的一半,我们应该让新的最低位为0(前最低为1则进位,否则舍去)
程序的机器级表示
数据格式
类型 | 汇编代码后缀 | 大小(Bytes) |
---|---|---|
Byte | b | 1 |
Word | w | 2 |
Double Words | l | 4 |
Quad Words | q | 8 |
Single | s | 4 |
Double | l | 8 |
访问信息
寄存器
64位名称 | 32位名称 | 16位名称 | 8位名称 | 特殊作用/被谁保存 |
---|---|---|---|---|
rax | eax | ax | al | 返回值 |
rbx | ebx | bx | bl | 被调用者保存 |
rcx | ecx | cx | cl | 参数4 |
rdx | edx | dx | dl | 参数3 |
rsi | esi | si | sil | 参数2 |
rdi | edi | di | dil | 参数1 |
rbp | ebp | bp | bpl | 被调用者保存 |
rsp | esp | sp | spl | 栈指针 |
r8 | r8d | r8w | r8b | 参数5 |
r9 | r9d | r9w | r9b | 参数6 |
r10 | r10d | r10w | r10b | 调用者保存 |
r11 | r11d | r11w | r11b | 调用者保存 |
r12 | r12d | r12w | r12b | 被调用者保存 |
r13 | r13d | r13w | r13b | 被调用者保存 |
r14 | r14d | r14w | r14b | 被调用者保存 |
r15 | r15d | r15w | r15b | 被调用者保存 |
操作数操作符(AT&T)
格式 | 操作数值 | 名称 |
---|---|---|
$Imm | Imm | 立即数 |
r | R[r] | 寄存器 |
Imm | M[Imm] | 直接寻址 |
(r) | M[R[r]] | 间接寻址 |
Imm(r) | M[R[r]+Imm] | 间接寻址 |
M[R+R] | 变址寻址 | |
M[R+R+Imm] | 变址寻址 | |
M[] | 比例变址寻址 | |
M[] | 比例变址寻址 | |
M[] | 比例变址寻址 | |
M[] | 比例变址寻址 |
控制
条件码
条件码寄存器
CPU还维持着一组单个位的条件码构成的寄存器。
条件码 | 名称 | 意义 | 执行t=a+b时的C表述 |
---|---|---|---|
CF | 进位标志 | 最高位进位 | (unsigned)t<(unsigned)a |
ZF | 零标志 | 结果为0 | t==0 |
SF | 符号标志 | 结果为负数 | t<0 |
OF | 溢出标志 | 结果发生补码溢出 | (a<0==b<0)&&(t<0!=a<0) |