1. 带符号整数和无符号整数的扩展
无符号整数的扩展,使用如下指令:
movzx source, desitination
source可以是8位或16位寄存器或内存位置,destination可以是16位或32位寄存器。
看如下例子:
[root@higtest lzhou1]# cat movzxtest.s
.section .text
.global _start
_start:
nop
movl $279, %ecx
movzx %cl, %ebx
movl $1, %eax
int $0x80
[root@higtest lzhou1]#
|
movzx把扩展的高位都清0
带符号整数的扩展,使用如下指令:
movsx source, destination
该指令试图在扩展的过程中保持带符号整数值的不变,看如下例子:
[root@higtest lzhou1]# cat movsxtetst.s
.section .text
.global _start
_start:
nop
movw $-79, %cx
movl $0, %ebx
movw %cx, %bx
movsx %cx, %eax
movl $1, %eax
movl $0, %ebx
int $0x80
|
通过gdb单步,可以看到%eax里存放的确实是-79,最高位确实是1而不是被清0了。
[root@higtest lzhou1]# gdb movsxtetst
GNU gdb Fedora (6.8-37.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) break *_start+1
Breakpoint 1 at 0x8048055: file movsxtetst.s, line 5.
(gdb) run
Starting program: /home/lzhou1/movsxtetst
Breakpoint 1, _start () at movsxtetst.s:5
5 movw $-79, %cx
Current language: auto; currently asm
(gdb) info registers
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbffa2dc0 0xbffa2dc0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048055 0x8048055 <_start+1>
eflags 0x212 [ AF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) s
_start () at movsxtetst.s:6
6 movl $0, %ebx
(gdb) info registers
eax 0x0 0
ecx 0xffb1 65457
edx 0x0 0
ebx 0x0 0
esp 0xbffa2dc0 0xbffa2dc0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048059 0x8048059 <_start+5>
eflags 0x212 [ AF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) s
_start () at movsxtetst.s:7
7 movw %cx, %bx
(gdb) info registers
eax 0x0 0
ecx 0xffb1 65457
edx 0x0 0
ebx 0x0 0
esp 0xbffa2dc0 0xbffa2dc0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x804805e 0x804805e <_start+10>
eflags 0x212 [ AF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) s
_start () at movsxtetst.s:8
8 movsx %cx, %eax
(gdb) info registers
eax 0x0 0
ecx 0xffb1 65457
edx 0x0 0
ebx 0xffb1 65457
esp 0xbffa2dc0 0xbffa2dc0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048061 0x8048061 <_start+13>
eflags 0x212 [ AF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) s
_start () at movsxtetst.s:9
9 movl $1, %eax
(gdb) info registers
eax 0xffffffb1 -79
ecx 0xffb1 65457
edx 0x0 0
ebx 0xffb1 65457
esp 0xbffa2dc0 0xbffa2dc0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048064 0x8048064 <_start+16>
eflags 0x212 [ AF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
|
2. SIMD
INTEL的单指令多数据(Single Instruction Multiple Data, SIMD)技术提供了定义整数的其他方式。这些新的数据类型使处理器可以同时对一组多个整数执行数学运算操作。、
多媒体扩展(Multimedia Extension, MMX)技术是在奔腾MMX和奔腾II处理器中引入的,它提供三种新的整数类型:
64位打包字节整数
64位打包字整数
64位打包双字整数
以上每种数据类型都提供把多个整数数据元素包含到(或者说打包到)单一的64位MMX寄存器中的能力。如下图所示:
注意:MMX寄存器被映射到FPU寄存器,所以使用MMX寄存器时要小心。记住,在使用任何MMX寄存器指令之前,都要把FPU寄存器中存储的所有数据保存到内存中。MMX平台提供了对MMX寄存器中打包的每个整数执行
并行数学操作的附加指令。
指令如下:
movq source, destination
如下列所示:
804808d: cd 80 int $0x80
[root@higtest lzhou1]# cat mmxtest.s
.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
[root@higtest lzhou1]#
|
在奔腾处理器上,MMX寄存器被映射到现有的FPU寄存器,所以根据所使用的gdb版本,在调试器中显示寄存器的信息可能有些困难。在gdb的老版本中,不能够直接显示MMX寄存器,必须显示它们对应的FPU寄存器。mm0寄存器被映射到第一个FPU寄存器--st0, mm1寄存器被映射到第二个FPU寄存器--st1。
流化SIMD扩展(Streaming SIMD Extension,SSE)技术,提供用于处理打包数据的8个128位XMM寄存器(名为XMM0到XMM7)。SSE2技术(奔腾4处理器中引入的)提供4种额外的打包带符号整数数据类型:
128位打包字节整数
128位打包字整数
128位打包双字整数
128位打包四字整数
这些值被打包在128位XMM寄存器中,如下图:
SSE平台提供附加的指令,用于对SSE寄存器中的打包数据值执行并行的数学操作。这使处理器可以使用相同的时钟周期处理多得多的信息。
指令格式如下:
movdqa source, destination
movdqu source, destination
a表示对准(align), u表示不对准。明显,当使用对准的数据时,SSE指令执行得更快。
并且,如果程序对未对准的数据使用movdqa指令,就会造成硬件异常。
看一个例子:
.section .data
values1:
.int 1, -1, 0, 135246
values2:
.quad 1, -1
.section .text
.global _start
_start:
nop
movdqu values1, %xmm0
movdqu values2, %xmm1
movl $1, %eax
movl $0, %ebx
int $0x80
|
阅读(2961) | 评论(0) | 转发(0) |