传送 MMX 整数到 MMX 寄存器中使用 MOVQ 指令。但是必须决定当前应用程序将使用 3 种打包整数格式中的哪一种。MOVQ 指令格式如下:其中,source 和 destination 可以是 MMX 寄存器,SSE 寄存器或者 64 位的内存位置 (但是不能在两者都是内存的情况下传送 MMX 整数)。
测试程序:
.section .data
values1:
.int 1, -1
values2:
.byte 0x10, 0x05, 0xff, 0x32, 0x47, 0xe4, 0x00, 0x01
.section .text
.global _start
_start:
nop
movq values1, %mm0
movq values2, %mm1
movl $1, %eax
movl $0, %ebx
int $0x80 进入 GDB 调试,观察 MM0 和 MM1 寄存器,其输出为:(gdb) print $mm0
$1 = {uint64 = -4294967295, v2_int32 = {1, -1}, v4_int16 = {1, 0, -1, -1},
v8_int8 = {1, 0, 0, 0, -1, -1, -1, -1}}
(gdb) print $mm1
$2 = {uint64 = 72308588487312656, v2_int32 = {855573776, 16835655},
v4_int16 = {1296, 13055, -7097, 256}, v8_int8 = {16, 5, -1, 50, 71, -28, 0,
1}}
(gdb) print/x $mm1
$3 = {uint64 = 0x100e44732ff0510, v2_int32 = {0x32ff0510, 0x100e447},
v4_int16 = {0x510, 0x32ff, 0xe447, 0x100}, v8_int8 = {0x10, 0x5, 0xff, 0x32,
0x47, 0xe4, 0x0, 0x1}}
(gdb) print/x $mm0
$4 = {uint64 = 0xffffffff00000001, v2_int32 = {0x1, 0xffffffff}, v4_int16 = {
0x1, 0x0, 0xffff, 0xffff}, v8_int8 = {0x1, 0x0, 0x0, 0x0, 0xff, 0xff,
0xff, 0xff}} 上面,uint64 表示把 64 位当成一个整体来显示;v2_int32 表示以 2 个 32 位数来显示;v4_int16 表示以 4 个 16 位数来显示;v8_int8 表示以 8 个 8 位数(字节) 来显示。 |