Chinaunix首页 | 论坛 | 博客
  • 博客访问: 984929
  • 博文数量: 633
  • 博客积分: 30780
  • 博客等级: 大将
  • 技术积分: 7532
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-12 21:07
文章分类

全部博文(633)

文章存档

2011年(10)

2010年(500)

2009年(47)

2008年(76)

我的朋友

分类:

2011-03-08 00:07:15

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)技术提供了定义整数的其他方式。这些新的数据类型使处理器可以同时对一组多个整数执行数学运算操作。、
  • MMX整数
多媒体扩展(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。

  • SSE整数
流化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) |
0

上一篇:(4)指令跳转

下一篇:(6) 关于X86浮点 (FPU)

给主人留下些什么吧!~~