彙編中的數字

數字類型

  • 無符號整數
  • 有符號整數
  • 二進制編碼十進制
  • 壓縮二進制編碼十進制
  • 單精度浮點數
  • 雙精度浮點數
  • 雙擴展浮點數
    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
  • 在GAS中定義整數
    • 示例
# 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

浮點數

  • 概念
    • 科學計數法
    • 二進制標記法
  • 標準的浮點數類型
    • 組成部分
      • 標誌位
      • 有效數字
      • 指數
  • IA-32 浮點數的值
數據類型 長度 有效數字長度 指數長度 範圍
單精度 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
  • 浮點數格式
    • .float
    • .double
  • 移動浮點數
    • 格式
      fld source
    • 示例
# 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
  • SSE 浮點類型
    • 單精度
指令 描述
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章