Professional Documents
Culture Documents
sse2浮点汇编指令集
sse2浮点汇编指令集
1. 数据搬移指令
movapd XMM,XMM/m128
movapd XMM/m128,XMM
movupd XMM,XMM/m128
movupd XMM/m128,XMM
把源存储器内容值送入目的寄存器,内存变量地址不必对齐 16 字节.
两条指令同 SSE1 的浮点搬移指令 movaps 和 movups 指令类似
movlpd XMM,m64
movlpd m64,XMM
movhpd XMM,m64
movhpd m64,XMM
2. 浮点常用算数运算指令
addpd XMM,XMM/m128
addsd XMM,XMM/m128
subpd XMM,XMM/m128
subsd XMM,XMM/m128
mulpd XMM,XMM/m128
mulsd XMM,XMM/m128
divpd XMM,XMM/m128
divsd XMM,XMM/m128
sqrtpd XMM,XMM/m128
sqrtsd XMM,XMM/m128
maxpd XMM,XMM/m128
maxsd XMM,XMM/m128
minpd XMM,XMM/m128
minsd XMM,XMM/m128
小结:
1. 以 pd 结尾的指令对两个双精度浮点数执行相同的运算
2. 以 sd 结尾的指令只对低 64 位双精度执行运算,高 64 位保持不变。
3. 当有 m128 存储器是要求内存地址必须为 16 字节对齐。
3. 位运算指令
andpd XMM,XMM/m128
源存储器 128 个二进制位'与'目的寄存器 128 个二进制位,结果送入目的寄存器,内存
变量地址必须对齐 16 字节边界.
andnpd XMM,XMM/m128
目的寄存器 128 个二进制位先取'非',再'与'源存储器 128 个二进制位,结果送入目的寄
存器,内存变量地址必须对齐 16 字节边界
orpd XMM,XMM/m128
源存储器 128 个二进制位'或'目的寄存器 128 个二进制位,结果送入目的寄存器,内存
变量地址必须对齐 16 字节边界
xorpd XMM,XMM/m128
源存储器 128 个二进制位'异或'目的寄存器 128 个二进制位,结果送入目的寄存器,内
存变量地址必须对齐 16 字节边界
4. 数据类型转换指令
cvtpd2ps XMM,XMM/m128
把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低 64
位,高 64 位清零,
cvtsd2ss XMM,XMM/m64
把源存储器低 64 位 1 个双精度浮点数变成 1 个单精度浮点数,结果送入目的寄存器
的低 32 位,高 96 位不变.
如果结果大于所能表示的范围,那么转化为 80000000h(正数也转为此值).
cvtpi2pd XMM,MM/m64
把源存储器两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器.
cvtpd2dq XMM,XMM/m128
把源存储器两个双精度浮点数变成两个双字有符号整数
cvtdq2pd XMM,XMM/m128
把源存储器低 64 位两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存
器,内存变量必须对齐内存 16 字节.
cvtsd2si r32,XMM/m64
把源存储器低 64 位 1 个双精度浮点数变成 1 个双字有符号整数,结果送入目的寄存
器.
此指令目的寄存器是 32 位通用寄存器
cvtsi2sd XMM,r32/m32
把源存储器 1 个双字有符号整数变成 1 个双精度浮点数,结果送入目的寄存器的低
64 位,高 64 位不变.
4.2.2 单精度浮点与整数之间转换
cvtps2dq XMM,XMM/m128
把源存储器 4 个单精度浮点数变成 4 个双字有符号整数,结果送入目的寄存器,内存
变量必须对齐内存 16 字节.
cvtdq2ps XMM,XMM/m128
把源存储器 4 个双字有符号整数变成 4 个单精度浮点数,结果送入目的寄存器,内存
变量必须对齐内存 16 字节.
float data_value;
data_value = data1 + data2;
movss xmm0,dword ptr [data1]
addss xmm0,dword ptr [data2]
movss dword ptr [data_value],xmm0
单精度浮点数
float data1 = 533.010;
movss xmm0,dword ptr [__real@440540a4 (03C9B44h)]//单精度浮点数用 movss
movss dword ptr [data1],xmm0
双精度浮点数
double dataA = 5532.564645;
movsd xmm0,mmword ptr [__real@40b59c908c9320da (0879BF0h)] //双精度浮点数用 movsd
movsd mmword ptr [dataA],xmm0
double data_value;
data_value = dataA + dataB; //双精度浮点数的加法
movsd xmm0,mmword ptr [dataA] //dataA 传给 xmm0
addsd xmm0,mmword ptr [dataB] // addsd 浮点数相加
movsd mmword ptr [data_value],xmm0 //讲 xmm0 传给变量 data_value