數字類型
- 無符號整數
- 有符號整數
- 二進制編碼十進制
- 壓縮二進制編碼十進制
- 單精度浮點數
- 雙精度浮點數
- 雙擴展浮點數
SIMD 擴展類型
- 64位壓縮整數
- 128位壓縮整數
- 128位壓縮單精度浮點數
- 128位壓縮雙精度浮點數
整數
- 標準的整數大小
- Byte
- Word
- Doubleword
- Quadword
- 無符號整數
- 有符號整數
# inttest.s - An example of using signed integers
.section .data
data:
.int -45
.section .text
.globl _start
_start:
nop
movl $-345, %ecx
movw $0xffb1, %dx
movl data, %ebx
movl $1, %eax
int $0x80
- 擴展無符號整數
- 格式
movzx source, destination
- 示例
# movzxtest.s - An example of the MOVZX instruction
.section .text
.globl _start
_start:
nop
movl $279, %ecx
movzx %cl, %ebx
movl $1, %eax
int $0x80
- 擴展有符號整數
- 格式
movsx source, destination
- 示例
# movsxtest.s - An example of the MOVSX instruction
.section .text
.globl _start
_start:
nop
movw $-79, %cx
movl $0, %ebx
movw %cx, %bx
movsx %cx, %eax
movl $1, %eax
movl $0, %ebx
int $0x80
# quadtest.s - An example of quad integers
.section .data
data1:
.int 1, -1, 463345, -333252322, 0
data2:
.quad 1, -1, 463345, -333252322, 0
.section .text
.globl _start
_start:
nop
movl $1, %eax
movl $0, %ebx
int $0x80
SIMD 整數
- MMX整數
- 64位壓縮字節整數
- 64位壓縮字整數
- 64位壓縮雙字整數
- 移動MMX整數
- 格式
movq source, destination
- 示例
# mmxtest.s - An example of using the MMX data types
.section .data
values1:
.int 1, -1
values2:
.byte 0x10, 0x50, 0xff, 0x32, 0x47, 0xe4, 0x00, 0x01
.section .text
.globl _start
_start:
nop
movq values1, %mm0
movq values2, %mm1
movl $1, %eax
movl $0, %ebx
int $0x80
- SSE 整數
- 128位壓縮字節整數
- 128位壓縮字整數
- 128位壓縮雙字整數
- 128位壓縮四字整數
- 移動SSE整數
- 格式
movdqa source, destination
- 示例
# ssetest.s - An example of using 128-bit SSE registers
.section .data
values1:
.int 1, -1, 0, 135246
values2:
.quad 1, -1
.section .text
.globl _start
_start:
nop
movdqu values1, %xmm0
movdqu values2, %xmm1
movl $1, %eax
movl $0, %ebx
int $0x80
二進制編碼十進制
- BCD編碼
- FPU BCD 值
- 格式
- fbld source 存入
- fbstp source 取出
- 示例
# bcdtest.s - An example of using BCD integer values
.section .data
data1:
.byte 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00
data2:
.int 2
.section .text
.globl _start
_start:
nop
fbld data1
fimul data2
fbstp data1
movl $1, %eax
movl $0, %ebx
int $0x80
浮點數
數據類型 |
長度 |
有效數字長度 |
指數長度 |
範圍 |
單精度 |
32 |
24 |
8 |
1.1810^-38 ~ 3.4010^38 |
雙精度 |
64 |
53 |
11 |
2.2310^-308 ~ 1.7910^308 |
擴展 |
80 |
64 |
15 |
3.3710^-4932 ~ 1.1810^4932 |
# floattest.s - An example of using floating point numbers
.section .data
value1:
.float 12.34
values2:
.double 2353.631
.section .bss
.lcomm data, 8
.section .text
.globl _start
_start:
nop
flds values1
fldl values2
fstl data
movl $1, %eax
movl $0, %ebx
int $0x80
指令 |
描述 |
FLD1 |
1.0 -> stack |
FLDL2T |
log(base2)10 ->stack |
FLDL2E |
log(base2)e -> stack |
FLDPI |
pi -> stack |
FLDLG2 |
log(base 10)2 -> stack |
FLDLN2 |
log(base e)2 -> stack |
FLDZ |
0 -> stack |
* 示例
# fpuvals.s - An example of pushing floating point constants
.section .text
.globl _start
_start:
nop
fld1
fldl2t
fldl2e
fldpi
fldlg2
fldln2
fldz
movl $1, %eax
movl $0, %ebx
int $0x80
指令 |
描述 |
MOVAPS |
將4個對齊的單精度浮點數移動到寄存器或內存 |
MOVUPS |
將4個非對齊的單精度浮點數值移動到寄存器或內存 |
MOVSS |
將一個單精度浮點數移動到內存或一個寄存器的低雙字 |
MOVLPS |
將兩個單精度浮點數移動到內存或低四字寄存器 |
MOVHPS |
將兩個單精度浮點數移動到內存或高四字寄存器 |
MOVLHPS |
從寄存器的低四字取出兩個單精度浮點數 |
MOVHLPS |
從寄存器的高四字取出兩個單精度浮點數 |
* 示例
# ssefloat.s - An example of moving SSE FP data types
.section .data
value1:
.float 12.34, 2345.543, -3493.2, 0.44901
value2:
.float -5439.234, 32121.4, 1.0094, 0.00003
.section .bss
.lcomm data, 16
.section .text
.globl _start
_start:
nop
movups value1, %xmm0
movups value2, %xmm1
movups %xmm0, %xmm2
movups %xmm0, data
movl $1, %eax
movl $0, %ebx
int $0x80
* 雙精度
指令 |
描述 |
MOVAPD |
將兩個對齊的雙精度浮點數移動到xmm寄存器 |
MOVUPD |
將兩個非對齊的雙精度浮點數移動到xmm寄存器 |
MOVSD |
將一個雙精度的浮點數移動到內存或寄存器的低四字 |
MOVHPD |
將一個雙精度浮點數移動到內存或寄存器的高四字 |
MOVLPD |
將一個雙精度的浮點數移動到內存或低四字寄存器 |
* 示例
# sse2float.s - An example of moving SSE2 FP data types
.section .data
value1:
.double 12.34, 2345.543
value2:
.double -5439.234, 32121.4
.section .bss
.lcomm data, 16
.section .text
.globl _start
_start:
nop
movupd value1, %xmm0
movupd value2, %xmm1
movupd %xmm0, %xmm2
movupd %xmm0, data
movl $1, %eax
movl $0, %ebx
int $0x80
轉換
指令 |
描述 |
CVTDQ2PD |
壓縮雙字整數轉換成壓縮雙精度浮點數 |
CVTDQ2PS |
壓縮雙字整數轉換成單精度浮點數 |
CVTPD2DQ |
將兩個壓縮雙精度浮點數轉換成雙字整數 |
CVTPD2PI |
將兩個壓縮雙精度浮點數轉換成雙字整數 |
CVTPD2PS |
將兩個雙精度浮點數轉換成壓縮單精度浮點數 |
CVTPI2PD |
將壓縮雙字整數轉換成壓縮雙精度浮點數 |
CVTPI2PS |
將壓縮雙字整數轉換成單精度浮點數 |
CVTPS2DQ |
將壓縮單精度浮點數轉換成雙字整數 |
CVTPS2PD |
將壓縮單精度浮點數轉換成壓縮雙精度浮點數 |
CVTPS2PI |
將壓縮單精度浮點數轉換成雙字整數 |
CVTTPD2PI |
將壓縮雙精度浮點數轉換成壓縮雙字整數 |
CVTTPD2DQ |
將壓縮雙精度浮點數轉換成壓縮雙字整數 |
CVTTPS2DQ |
將壓縮單精度浮點數轉換成壓縮雙字整數 |
CVTTPS2PI |
將壓縮單精度浮點數轉換成壓縮雙字整數 |
# convtest.s - An example of data conversion
.section .data
value1:
.float 1.25, 124.79, 200.0, -312.5
value2:
.int 1, -435, 0, -25
.section .bss
data:
.lcomm data, 16
.section .text
.globl _start
_start:
nop
cvtps2dq value1, %xmm0
cvttps2dq value1, %xmm1
cvcvtdq2ps value2, %xmm2
movdqu %xmm0, data
movl $1, %eax
movl $0, %ebx
int $0x80