持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第35天,点击查看活动详情
定点乘法指令举例
题目:
分析一把
'mulb %bl”功能为R[ax]<一R[al]×R[bl],执行结果如下
无符号乘:
R[ax]=B4H*11H(即180与17相乘)
结果:
所以R[ax]=0BF4H,真值为3060=180*17
'imulb %bl”功能为R[ax]<一R[al]×R[bl],执行结果如下
带符号乘:
R[ax]=B4H*11H(即-76与17相乘)为负数与真值3060不相同
但是相乘后的结果一共有16位,后8位跟真值的后8位是相同的,不同的在于前8位
分析完毕
题目
分析一把:
imull,说明是带符号整数。
R[eax]+R[ebx]*4=000000B4H+00000011H<<2=000000F8H
R[eax]=(-16)*M[000000F8H]
由题目得出:M[000000F8H]=000000A0H
所以R[eax]=(-16)*000000A0H(带符号整数乘)
=16*(-000000A0H)
=FFFFFF60H<<4
=FFFFFF600H
EAX中的真值为-2560
按位运算指令举例
c表达式类型转换顺序
IA-32的浮点处理架构
x87 FPU指令
早期的浮点处理器是作为CPU的外置协处理器出现的
x87 FPU特指与x86处理器配套的浮点协处理器架构
-
浮点寄存器采用栈结构
- 深度为8,宽度为80位,即8个80位寄存器
- 名称为ST(0) --ST(7),栈顶为ST(0),编号分别为0~7
-
所有浮点运算都按80位扩展精度进行
-
浮点数在浮点寄存器和内存之间传送
- float、double.Rlong double型变量在内存分别用IEEE 754单精度、双精度和扩展精度表示,分别占32位( 4B)、64位(8B)和96位(12B,其中高16位无意义)
- float、double、long double类型变量在浮点寄存器中都用80位扩展精度表示
- 从浮点寄存器到内存:80位扩展精度格式转换为32位或64位
- 从内存到浮点寄存器:32位或64位格式转换为80位扩展精度格式
x87浮点处理指令举例
又到了经典的分析一把时间捏:
f(10)的值是多少?机器数又是多少?
该方法对应的机器操作如下
两条重要的指令的功能如下:
fld1∶将常数1.0压入栈顶ST(o0)
fidivl:将指定存储单元操作数M[R[ebp]+8]中的int型数转换为double型, 再将ST(0)除以该数,并将结果存入ST(0)中
- 从这个例子我们可以看出编译器的设计和硬件结构紧密相关
- 对于编译器设计者来说,只有真正了解底层硬件结构和真正理解指令集体系结构,才能够翻译出没有错误的目标代码,并为程序员完全屏蔽掉硬件实现的细节,方便应用程序员开发出可靠的程序。
- 对于应用程序开发者来说,也只有真正了解底层硬件的结构,才有能力编制出高效的程序,能够快速定位出错的地方,并对程序的行为作出正确的判断。
MMX及SSE指令集
由MMX(多媒体扩展)发展而来的SSE架构
- MMX指令使用8个64位寄存器MMg-MM7,借用8个80位寄存器ST(O)~ST(7)中64位尾数所占的位,可同时处理8个字节,或4个字,或2个双字,或一个64位的数据,是一种SIMD(一条指令处理多数据)技术。
- MMX指令并没带来3D游戏性能的显著提升,故推出SSE指令,并陆续推出SSE2、SSE3、SSSE3和SSE4等采用SIMD技术的指令集,这些统称为SSE指令集
- SSE指令集将80位浮点寄存器扩充到128位多媒体扩展通用寄存器XMMO~XMM7,可同时处理16个字节 或8个字,或4个双字(32位整数或单精度浮点数),或两个四字的数据
- 从SSE2开始,还支持128位整数运算,或同时并行处理两个64位双精度浮点数