关于新版2022年2月的新版CPU包含寄存器的nasm汇编语言。
;---------------------
; CPU 寄存器的验证
; by 超级蓝果
;---------------------
;
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;
; vL isqjIi rs rIXjsIk iigviiiiVdii SJJsZLJsV iijvr E U Yi i
; uBBs bQ B B XQ Bi viBqvrJiVqii BRi iBi iQg YUBSi ukiiB iSBB sSjBBkXr iBB BB vB
; KP B B Bid Vv BQv g Ii Qiiii BgiiiBiiiQM viBiu i B Bi Bv dq BBQBB
; sgBi iYiEBi XBr BB iQ B Pr iiiiv iUi iBi iI diZ B ii B Bv uDiurMB ii i i i
; is Bi Bi B ZI Bvg gi vidYiEdEgv vYvPSBuDjvv BiR B ii B JQD dv Qi
; kBiE B B Rrv vQ iBB B B Q B MB B UBv B B B sYvPBs B KBB
; BMBQiikBBQBq ivvsiB Vg vB JB iQ iB Br UQL B RD B B B iB iB uZk gM
; irriiiiii ii i virrrrrirrrr v r r i Ji r ii
;
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; IA-32处理器的关键特性
; 2004 Intel Pentium Processor 755
; GP:32 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 4GB
; 2006 Intel Core Duo Processor T2600
; GP:32 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 4GB
; 2008 Intel A_m Processor Z5xx series
; GP:32 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 4GB
;----------------------------------------------------------------------------------------------------
; Intel 64处理器的关键特性
; 2004 64-bit Intel Xeon Processor with 800 MHz System Bus
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2005 64-bit Intel Xeon Processor MP with 8MB L3
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1024GB
; 2005 Intel Pentium 4 Processor Extreme Edition Supporting Hyper-Threading Technology
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2005 Intel Pentium Processor Extreme Edition 840
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2005 Dual-Core Intel Xeon Processor 7041
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2005 Intel Pentium 4 Processor 672
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2006 Intel Pentium Processor Extreme Edition 955
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2006 Intel Core 2 Extreme Processor X6800
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2006 Intel Xeon Processor 5160
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2006 Intel Xeon Processor 7140
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2006 Intel Core 2 Extreme Processor QX6700
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2006 Quad-core Intel Xeon Processor 5355
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2007 Intel Core 2 Duo Processor E6850
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2007 Intel Xeon Processor 7350
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1024GB
; 2007 Intel Xeon Processor 5472
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 256GB
; 2008 Intel A_n Processor
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr Up _ 64GB
; 2008 Intel Xeon Processor 7460
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1024GB
; 2008 Intel A_n Processor 330
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr Up _ 64GB
; 2008 Intel Core i7-965 Processor Extreme Edition
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2010 Intel Core i7-620M Processor
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB
; 2010 Intel Xeon Processor 5680
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1TB
; 2010 Intel Xeon Processor 7560
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 16T
; 2011 Intel Core i7-2600K Processor
; GP:32,64 FPU:80 MMX:64 XMM:128 YMM:256 Max.Ext.Addr 64GB ;++++++
; 2011 Intel Xeon Processor E3-1280
; GP:32,64 FPU:80 MMX:64 XMM:128 YMM:256 Max.Ext.Addr 1TB
; 2011 Intel Xeon Processor E7-8870
; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 16TB ;------
;----------------------------------------------------------------------------------------------------
; 以前IA-32处理器的关键特性
; 1978 8086
; 16 GP Ext.Bus 16 Max.Ext.Addr 1MB
; 1982 Intel 286
; 16 GP Ext.Bus 16 Max.Ext.Addr 16MB
; 1985 Intel 386 DX Processor
; 32 GP Ext.Bus 16 Max.Ext.Addr 4GB
; 1989 Intel 486 DX Processor
; 32 GP 80 FPU Ext.Bus 32 Max.Ext.Addr 4GB
; 1993 Pentium Processor
; 32 GP 80 FPU Ext.Bus 64 Max.Ext.Addr 4GB
; 1995 Pentium Pro Processor
; 32 GP 80 FPU Ext.Bus 64 Max.Ext.Addr 64GB
; 1997 Pentium II Processor
; 32 GP 80 FPU 64 MMX Ext.Bus 64 Max.Ext.Addr 64GB
; 1999 Pentium III Processor
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB
; 1999 Pentium III and Pentium III Xeon Processors
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB
; 2000 Pentium 4 Processor
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB
; 2001 Intel Xeon Processor
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB
; 2002 Intel Xeon Processor
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB
; 2003 Pentium M Processor
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 4GB
; 2004 Intel Pentium 4 Processor Supporing Hyper-Threading Technology at 90 nm Process
; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB
;=====================================================================================================
[bits 64]
%include 'd:\radasm\nasm\inc\masm32.inc'
[extern StdOut]
[extern StrLen]
[extern printf]
[extern ClearScreen]
[extern getchar]
[extern ExitProcess]
; 指令编码概要
; Intel 64 和 IA-32 指令说明格式
; Mod 寄存器模式, Opcode 指令码, SIB 基础索引位移
;------------------------------------------------------------------------------------
; 指令附加 指令码 寄存器模组 SIB 地址数 立即数
;------------------------------------------------------------------------------------
; 升4位1字节 1-,2-,3-字节 1字节(如真) 1字节(如真) 地址1,2,4字节或无 数值1,2,4字节或无
;
; ModR/M SIB
; 7 6 5 3 2 0 7 6 5 3 2 0
;-------------------------------------------
; Mod Reg/Opcode R/M Scale Index Base
;-------------------------------------------
; 表格 REX 前缀段[位:0100WRXB]
;
; REX 寄存器位
;
; 段名 位 定义
;=======================================================
; - 7:4 0100
; W 3 0 = CS.D 操作数尺寸
; 1 = 64位操作尺寸
; R 2 扩展 ModR/M 寄存器段
; X 1 扩展 SIB 索引段
; B 0 扩展 ModR/M r/m 段,SIB基本段,指令码寄存器段
; 内存地址没用SIB字节;REX.X 没使用
;----------------------------------------------------
; ModRM Byte
; REX PREFIX Opcode mod reg r/m
; 01000WR0B <>11 rrr bbb
;
; Rrrr Bbbb
; 内存地址使用SIB字节
;-----------------------------------------------------
; ModRM Byte SIB Byte
; REX PREFIX Opcode mod reg r/m scale index base
; 01000WRXB <>11 rrr 100 ss xxx bbb
;
; Rrrr Xxxx Bbbb
; 寄存器操作码在指令码中;REX.X & REX.R没使用
;-----------------------------------------------------
;
; REX PREFIX Opcode mod reg
; 01000W00B <>11 bbb
;
; Bbbb
;-----------------------------------------------------
; 指定多选REX加码
; ModR/M or SIB 子加码 完全操作模式 完全立即模式 附要
;------------------------------------------------------------------------------------
; ModR/M 字节 mod <> 11 SIB字节 SIB字节ESP基址 REX附加40位不解码
; r/m == b*100(ESP) SIB在R12基地上也正确
;------------------------------------------------------------------------------------
; ModR/M 字节 mod == 0 基寄存器没用 非EBP必用 REX附加40位不解码
; r/m == b*101(EBP) mod = 01 用RBP或R13,非其它
; 必须 mod = 01,其它为0
;------------------------------------------------------------------------------------
; SIB 字节 索引 == 0100(ESP) ESP不能用于 REX附加40位不解码
; 索引寄存器 扩展索引 RSP在R12
; R12能用于索引
;------------------------------------------------------------------------------------
; SIB 字节 基础 == 0101(EBP) 基寄存器在mod加码 REX附加40位不解码
; 被用于 EBP/RBP或R13
; 注:不考虑REX.B的值
; 例: 48 B8 8877665544332211 MOV RAX,1122334455667788H
; 内存段选
; 15 0 31 0
; ---------- ---------------------
; | 段选 | | 偏移(或直接地址)|
; ---------- ---------------------
; 64位模式内存段选
; 15 0 63 0
; ---------- ---------------------
; | 段选 | | 偏移(或直接地址)|
; ---------- ---------------------
[section .data]
n_16 db 0ffh,0ffh
n_32 db 0ffh,0ffh,0ffh,0ffh
n_64 db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
n_128 db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
n_256 dq 0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh
n_512 dq 0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh
dq 0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh
To_8086 db '8位寄存器',0dh,0ah
db '---------------------------------------------------------------',0dh,0ah,0
; rex.r = 0
_al db 'AL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_cl db 'CL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_dl db 'DL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_bl db 'BL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
; 没有 rex
_ah db 'AH = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_ch db 'CH = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_dh db 'DH = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_bh db 'BH = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
; 任何 rex
_spl db 'SPL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_bpl db 'BPL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_sil db 'SIL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_dil db 'DIL = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
; 仅用于64位模式 rex.r=1 的 R8-R15
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_r8l db 'R8L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_r9l db 'R9L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_r10l db 'R10L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_r11l db 'R11L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
_r12l db 'R12L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_r13l db 'R13L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_r14l db 'R14L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_r15l db 'R15L = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 和_r8l-_r15l 一样的
_r8b db 'R8B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_r9b db 'R9B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_r10b db 'R10B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_r11b db 'R11B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
_r12b db 'R12B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_r13b db 'R13B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_r14b db 'R14B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_r15b db 'R15B = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
To_286 db '16位 寄存器',0dh,0ah
db '---------------------------------------------------------------',0dh,0ah,0
_ax db 'AX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_cx db 'CX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_dx db 'DX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_bx db 'BX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
; rex.r = 0
_sp db 'SP = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_bp db 'BP = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_si db 'SI = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_di db 'DI = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
_ip db 'IP = %X',0dh,0ah,0dh,0ah,0
; 仅用于64位模式 rex.r=1 的 R8-R15
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_r8w db 'R8w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_r9w db 'R9w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_r10w db 'R10w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_r11w db 'R11w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
_r12w db 'R12w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_r13w db 'R13w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_r14w db 'R14w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_r15w db 'R15w = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;---------------------------------------------------------------------------------------
To_386 db '32位 寄存器',0dh,0ah
db '---------------------------------------------------------------',0dh,0ah,0
_eax db 'EAX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_ecx db 'ECX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_edx db 'EDX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_ebx db 'EBX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
; rex.r = 0
_esp db 'ESP = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_ebp db 'EBP = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_esi db 'ESI = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_edi db 'EDI = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
; 32位 寄存器
; EFLAGS 寄存器
; 比较位单元
;|<-------------------------------- PUSHFD/POPFD ------------------------------->|
;| |<-------- PUSHF/POPF -------->|
; 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
;---------------------------------------------------------------------------------------
; 0 0 0 0 0 0 0 0 0 0 I V V A V R 0 N | I | O D I T S Z 0 A 0 P 1 C
; D I I C M F T | O -| F F F F F F F F F
; P F | P |
; | L |
;---------------------------------------------------------------------------------------
; X ID 标志 (ID)
; X 虚拟中断 (VIP)
; X 虚拟中断标志(VIF)
; X 对齐检查/访问控制(AC)
; X 虚8086模式(VM)
; X 挂起标志(RF)
; X 任务 (NT)
; X I/O 环级(IOPL)
; S 溢出标志(OF)
; C 连接标志(DF)
; X 开中断标志(IF)
; X 跟踪标志(TF)
; S 符号标志(SF)
; S 零标志(ZF)
; S BCD进位标志(AF)
; S 局部标志(PF)
; S 进位标志(CF)
; S 结构标志
; C 控制标志
; X 系统标志
; 0 没有使用这个值
_eflags db 'EFLAGS = %X',0dh,0ah,0dh,0ah,0
_eip db 'EIP = %X',0dh,0ah,0dh,0ah,0
;仅用于64位模式 rex.r=1 的 R8-R15
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_r8d db 'R8d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_r9d db 'R9d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_r10d db 'R10d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_r11d db 'R11d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
_r12d db 'R12d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_r13d db 'R13d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_r14d db 'R14d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_r15d db 'R15d = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
To_ia64 db '64位 寄存器',0dh,0ah
db '---------------------------------------------------------------',0dh,0ah,0
_rax db 'RAX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_rcx db 'RCX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_rdx db 'RDX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_rbx db 'RBX = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
; rex.r = 0
_rsp db 'RSP = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_rbp db 'RBP = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_rsi db 'RSI = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_rdi db 'RDI = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
_rflags db 'RFLAGS = %X',0dh,0ah,0dh,0ah,0
; 在64位模式,RIP地址使用32位数计算下一指令,扩展值加到64位RIP值
_rip db 'RIP = %X',0dh,0ah,0dh,0ah,0
;x87 FPU 数据寄存器
;符号79 扩充78-64 数值63-0
;控制寄存器15-0 过去指令指针47-0(FCS:FIP)
;结构寄存器15-0 过去数据指针47-0(FDS:FDP)
;标记寄存器15-0 指令码10-0
; FPU 数据寄存器堆栈
;-------------------------------------------------
; 堆栈 7
; | 6
; | 5 ST(2)
; | 4 ST(1) 顶部
; V 3 ST(0) <- |011b|
; 2
; 1
; 0
; 例子:
; 计算 (5.6 * 2.4) + (3.8 * 10.3)
; 代码:
; fld value1 ;(a) value1 = 5.6
; fmul value2 ;(b) value2 = 2.4
; fld value3 ; value3 = 3.8
; fmul value4 ;(c) value4 = 10.3
; fadd st(1) ;(d)
;
; (a) (b) (c) (d)
; ------------ ------------- ------------- --------------
; R7 R7 R7 R7
; R6 R6 R6 R6
; R5 R5 R5 R5
; R4 5.6 ST(0) R4 13.44 ST(0) R4 13.44 ST(1) R4 13.44 ST(1)
; R3 R3 R3 39.14 ST(0) R3 52.58 ST(0)
; R2 R2 R2 R2
; R1 R1 R1 R1
; R0 R0 R0 R0
; ------------ -------------- -------------- --------------
;x87 FPU 结构寄存器
; -------------- FPU 忙
; | v------ 栈顶指针
; 15 14 13 11 10 9 8 7 6 5 4 3 2 1 0
; ------------------------------------
; |B| C| _P | C|C|C|E|S|P|U|O|Z|D|I|
; | | 3| | 2|1|0|S|F|E|E|E|E|E|E|
; ------------------------------------
; | | | | | | | | | | | |
; 代码---------------- | | | | | | | |
; 异常结构-------------- | | | | | | |
; 堆栈特质---------------- | | | | | |
; 异常标志------------------ | | | | |
; 精度 ---------------------- | | | |
; 溢出 ------------------------ | | |
; 零除 -------------------------- | |
; 数据操作 ------------------------ |
; 错误操作 --------------------------
;x87 FPU 控制字
; ---------------- 初控制
; | ------------ 环控制
; | | | v------ 精度控制
; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
; --------------------------------------
; | | | | X| RC | PC| | |P|U|O|Z|D|I|
; | | | | | | | | |M|M|M|M|M|M|
; --------------------------------------
; | | | | | |
; | | | | | |
; | | | | | |
; | | | | | |
; 异常屏蔽 | | | | | |
; 精度 ---------------------- | | | | |
; 未明 ------------------------ | | | |
; 溢出 -------------------------- | | |
; 零除 ---------------------------- | |
; 数据操作 -------------------------- |
; 错误操作 ----------------------------
;
; x87 FPU 初始化指令 finit/fninit 或 fsave/fnsave,初始值为 037fh
; 作用:屏蔽所有浮点异常,设置近环和设置FPU为64位精度
;
; 精度控制段 (PC)
; ----------------------
; 精度 | PC段
; ----------------+-----
; 单精度 (24位) | 00b
; 保留 | 01b
; 双精度 (53位) | 10b
; 双精度扩展(64位)| 11b
; ----------------------
; 环模式编码控制段(RC)
; ----------------------
; 环模式|RC设置|描述
; ------+------+--------
; 近环 | 00b |
; 下环 | 01b |
; 上环 | 10b |
; 零塔环| 11b |
; ----------------------
_r0 db 'R8 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_r1 db 'R9 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_r2 db 'R10 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_r3 db 'R11 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
_r4 db 'R12 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_r5 db 'R13 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_r6 db 'R14 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_r7 db 'R15 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
; 仅用于64位模式 rex.r=1 的 R8-R15
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_r8 db 'R8 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 0
_r9 db 'R9 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 1
_r10 db 'R10 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 2
_r11 db 'R11 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 3
_r12 db 'R12 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 4
_r13 db 'R13 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 5
_r14 db 'R14 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 6
_r15 db 'R15 = %X',0dh,0ah,0dh,0ah,0 ;reg 段 7
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_lip db 'LIP = %X',0dh,0ah,0dh,0ah,0
; 使用RS_RSSP 和SAVEPREVSSP指令操作影子栈在64位格式值上
; 例:SSP = 1000h 新影子栈 地址 3ff8h,出影子栈后为 4000h, 1000h成为旧的SSP值
_ssp db 'SSP = %X',0dh,0ah,0dh,0ah,0
To_16f db '16位 段寄存器',0dh,0ah
db '---------------------------------------------------------------',0dh,0ah,0
_cs db 'CS = %X',0dh,0ah,0dh,0ah,0
_ds db 'DS = %X',0dh,0ah,0dh,0ah,0
_es db 'ES = %X',0dh,0ah,0dh,0ah,0
_ss db 'SS = %X',0dh,0ah,0dh,0ah,0
_fs db 'FS = %X',0dh,0ah,0dh,0ah,0
_gs db 'GS = %X',0dh,0ah,0dh,0ah,0
; MS-DOS 完全模式浮点寄存器
; CR0.NE[5位]设1,主模式有异常,异常段ES标志进fpu单元,标符#MF
; 如 IGNNE#位脚不能访问那访问 FERR#位脚, 当 FERR#位脚访问或延时有个异常
; 可屏敝x87 fpu 单元,异常后进入MMX单元
; FERR#脚连接 可用 IRQ13中断,当 FERR#脚 被访问时 调用中断75h
; BIOS 的中断75h被NMI中断2设置使用
; IGNNE#位脚访问中止浮点错有一个异常
; 在软件中一个 wait/fwait 指令等待 iret 指令处理返回
; 不支持MMX指令cr0.em[2位]为0,异常(#UD)
; 例:
; ...
; ...
; mov eax,1
; cpuid
; test edx,00800000h ;EDX中23位设为1了吗?
; jnz
; ...
_st0 db 'ST(0) = %X',0dh,0ah,0dh,0ah,0
_st1 db 'ST(1) = %X',0dh,0ah,0dh,0ah,0
_st2 db 'ST(2) = %X',0dh,0ah,0dh,0ah,0
_st3 db 'ST(3) = %X',0dh,0ah,0dh,0ah,0
_st4 db 'ST(4) = %X',0dh,0ah,0dh,0ah,0
_st5 db 'ST(5) = %X',0dh,0ah,0dh,0ah,0
_st6 db 'ST(6) = %X',0dh,0ah,0dh,0ah,0
_st7 db 'ST(7) = %X',0dh,0ah,0dh,0ah,0
;------------------------------------------
;
; fpu 和 MMX 两者之间的转换
; fpu 入点为00b,MMX寄存器为11b,可从64位到79位
; 早点的在MMX中的fpu结果会丢失
; fpu 中的_S栈顶设置0
; 使用FSAVE和FXSAVE 保存 fpu 入点结构
; EMMS指令可从x87换到MMX结构
; MMX 寄存器
; 64位 数据类型
; EMMS单元
;;;;;;;; 扩展CPUID指令,测试支持,不识别异常(#UD)
;
; MMX 指令可用于
; 数据转换
; 计算
; 比较
; 复盖
; 解包
; 逻辑
; 位移
; EMMS (入点使用时11b,一般值为00b)
;--------------------------------------------------------
; 注:用CPUID 01功能测试可用性! EDX.MMX [23位],设置0失效
; 开放MMX技术可用 EAX,EBX,等寄存器,MMX可用于64位结构体数据
; 在多任务操作系统环境中要保存和恢复MMX的设置结构
; 异常于执行浮点指令,内存超围,计算,int 16 辅助测试FERR#位脚
; 补:(扩展,没有必要了解)
; 机器码前缀 067h 内存操作
; 机器码前缀 0f0h 非法指令异常 (#UD)
; 机器码前缀 0f3h,0f2h,066h 不明结果,保留
; 机器码前缀 02eh,036h,03eh,026h,064h,065h,内存操作和未明结果
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; SSE SIMD 扩展
_mmx0 db 'MMX0 = %X',0dh,0ah,0dh,0ah,0
_mmx1 db 'MMX1 = %X',0dh,0ah,0dh,0ah,0
_mmx2 db 'MMX2 = %X',0dh,0ah,0dh,0ah,0
_mmx3 db 'MMX3 = %X',0dh,0ah,0dh,0ah,0
_mmx4 db 'MMX4 = %X',0dh,0ah,0dh,0ah,0
_mmx5 db 'MMX5 = %X',0dh,0ah,0dh,0ah,0
_mmx6 db 'MMX6 = %X',0dh,0ah,0dh,0ah,0
_mmx7 db 'MMX7 = %X',0dh,0ah,0dh,0ah,0
; XMM 寄存器
; 128位 数据类型
; SSE 扩展 cpuid.01h:edx.sse[25位]为1可用
; 128位数据寄存器 调用xmm寄存器于非64位模式,16个XMM寄存器可用于64位模式
; 32位的 MXCSR寄存器私控结构位用于XMM寄存器
; 128位包数据用于浮点数据类型,双精四字值
; mmx和xmm低位复用,使用MXCSR寄存器保存和恢复
; 数值支持指令和数据
; 扩展到cpuid指令
; 32位值时,分四个数据包加强媒体和通讯和大数等
; 大数组可用于浮点值和整型数据
; 高冲缓存数据流可进入MMX和出入MMX寄存器保存和测试
; SFENCE 排序保存私用控制内存类型
; 检测SSE 扩展后可用于,虚86模式,实模式,保护模式和所有IA-32执行模式
_xmm0 db 'XMM0 = %X',0dh,0ah,0dh,0ah,0
_xmm1 db 'XMM1 = %X',0dh,0ah,0dh,0ah,0
_xmm2 db 'XMM2 = %X',0dh,0ah,0dh,0ah,0
_xmm3 db 'XMM3 = %X',0dh,0ah,0dh,0ah,0
_xmm4 db 'XMM4 = %X',0dh,0ah,0dh,0ah,0
_xmm5 db 'XMM5 = %X',0dh,0ah,0dh,0ah,0
_xmm6 db 'XMM6 = %X',0dh,0ah,0dh,0ah,0
_xmm7 db 'XMM7 = %X',0dh,0ah,0dh,0ah,0
; 32位 寄存器
; 复位初始化值 1f80h
; SIMD浮点单元(简单指令多段数据执行模式)
; 标志和屏蔽SSE,SSE2,SSE3 SIMD 结构和控制信息的异常
; 控制SIMD操作
; 压入和释放0标志为SIMD私有的浮点操作控制
; 用 STMXCSR 和STMXCSR 和 FXRS_R 和 FXSAVE 从内存中保存和读取到寄存器
; 16位到31位保留位不为空值,使用保存和读取指令 FXRS_R,LDMXCSR指令会有个常规(#GP)保护异常
;;;;;;;;;;;;;; MXCSR的DAZ标志位检查支持
; 128位 SIMD 数据例子:
;1:
; ...
; movaps xmm0,[eax] ;单浮点
; movaps xmm1,[ebx]
; addpd xmm0,xmm1
; ...
;2:
; ...
; movapd xmm0,[eax] ;双浮点
; movaps xmm1,[ebx]
; xorpd xmm0,xmm1
; ...
;MXCSR 控制/结构寄存器
; 31 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
; ------------------------------------------------------------------------------
; | | F| R | P| U| O|Z|D|I|D|P|U|O|Z|D|I|
; | 保留 | T| C | M| M| M|M|M|M|A|E|E|E|E|E|E|
; | | Z| | | | | | | |Z| | | | | | |
; ------------------------------------------------------------------------------
; | | | | | | | | | | | | | | |
; 压入零代码------------------------------- | | | | | | | | | | | | | |
; 环控制 ------------------------------------ | | | | | | | | | | | | |
; 精度屏蔽 ----------------------------------------- | | | | | | | | | | | |
; 未明屏蔽 -------------------------------------------- | | | | | | | | | | |
; 溢出屏蔽 ----------------------------------------------- | | | | | | | | | |
; 除零屏蔽 ------------------------------------------------- | | | | | | | | |
; 零数值屏蔽--------------------------------------------------- | | | | | | | |
; 错误操作数----------------------------------------------------- | | | | | | |
; 零数值区 ------------------------------------------------------- | | | | | |
; 精度标志 --------------------------------------------------------- | | | | |
; 未明标志 ----------------------------------------------------------- | | | |
; 溢出标志 ------------------------------------------------------------- | | |
; 零除标志 --------------------------------------------------------------- | |
; 数值标志 ----------------------------------------------------------------- |
; 错误操作标志 ----------------------------------------------------------------
_mxcsr db 'MXCSR = %X',0dh,0ah,0dh,0ah,0
_cr0 db 'CR0 = %X',0dh,0ah,0dh,0ah,0
_cr2 db 'CR2 = %X',0dh,0ah,0dh,0ah,0
_cr3 db 'CR3 = %X',0dh,0ah,0dh,0ah,0
_cr4 db 'CR4 = %X',0dh,0ah,0dh,0ah,0
_gdtr db 'GDTR = %X',0dh,0ah,0dh,0ah,0
_ldtr db 'LDTR = %X',0dh,0ah,0dh,0ah,0
_idtr db 'IDTR = %X',0dh,0ah,0dh,0ah,0
_dr0 db 'DR0 = %X',0dh,0ah,0dh,0ah,0
_dr1 db 'DR1 = %X',0dh,0ah,0dh,0ah,0
_dr2 db 'DR2 = %X',0dh,0ah,0dh,0ah,0
_dr3 db 'DR3 = %X',0dh,0ah,0dh,0ah,0
_dr6 db 'DR6 = %X',0dh,0ah,0dh,0ah,0
_dr7 db 'DR7 = %X',0dh,0ah,0dh,0ah,0
_msr db 'MSR = %X',0dh,0ah,0dh,0ah,0
;在IA-32e 模式 CR9-CR15和 DR8-DR15 没立即数会有指令异常(#UD)
_cr8 db 'CR8 = %X',0dh,0ah,0dh,0ah,0 ;在64位模式 CR8是私有任务寄存器(TPR)
;.........................................
_cr9 db 'CR9 = %X',0dh,0ah,0dh,0ah,0
_cr10 db 'CR10 = %X',0dh,0ah,0dh,0ah,0
_cr11 db 'CR11 = %X',0dh,0ah,0dh,0ah,0
_cr12 db 'CR12 = %X',0dh,0ah,0dh,0ah,0
_cr13 db 'CR13 = %X',0dh,0ah,0dh,0ah,0
_cr14 db 'CR14 = %X',0dh,0ah,0dh,0ah,0
_cr15 db 'CR15 = %X',0dh,0ah,0dh,0ah,0
; 调试寄存器
_dr8 db 'DR8 = %X',0dh,0ah,0dh,0ah,0
_dr9 db 'DR9 = %X',0dh,0ah,0dh,0ah,0
_dr10 db 'DR10 = %X',0dh,0ah,0dh,0ah,0
_dr11 db 'DR11 = %X',0dh,0ah,0dh,0ah,0
_dr12 db 'DR12 = %X',0dh,0ah,0dh,0ah,0
_dr13 db 'DR13 = %X',0dh,0ah,0dh,0ah,0
_dr14 db 'DR14 = %X',0dh,0ah,0dh,0ah,0
_dr15 db 'DR15 = %X',0dh,0ah,0dh,0ah,0
;-----------------------------------------------------------------------
; 128位 数据类型
; SSE 64位模式和完全模式 (SSE扩展)
; SSE2 SSE3/SSSE3 程序环境
; CPUID.01h:EDX.SSE2 [26位]为1 支持SSE2扩展为128位数据处理
; cr4.osfxsr[9位]和cr4.osxmmexcpt[10位]被操作系统设置后可跳过指令FXSAVE
; 和FXRS_R指令和SIMD浮点异常
; LFENCE,MFENCE,SFENCE 用PASUE指令等待一个超级wait循环
; 用于 数据移动
; 数学指令计算
; 逻辑指令计算
; 比较指令计算
; 位移指令计算
; 复盖指令
; SSE扩展 64位SIMD整型指令可用XMM寄存器寻址128位内存
; 注: cpuid.01h:edx.fxsr[24位]为1 支持FXSAVE和FXRS_R指令
; FNSAVE,FSAVE指令
; 补:
; PREFETCHT0 取高速缓存临时数据
; PREFETCHT1 取高速缓存级别2数据
; PREFETCHT2 取高速缓存级别2数据
; PREFETCHTA 取最小高速缓存数据
; 前缀 2eh,3eh 隐含私有测试开发,用于跳转和级别指令
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; XMM8-XMM15 用REX.R 进入64位模式使用
_xmm8 db 'XMM8 = %X',0dh,0ah,0dh,0ah,0
_xmm9 db 'XMM9 = %X',0dh,0ah,0dh,0ah,0
_xmm10 db 'XMM10 = %X',0dh,0ah,0dh,0ah,0
_xmm11 db 'XMM11 = %X',0dh,0ah,0dh,0ah,0
_xmm12 db 'XMM12 = %X',0dh,0ah,0dh,0ah,0
_xmm13 db 'XMM13 = %X',0dh,0ah,0dh,0ah,0
_xmm14 db 'XMM14 = %X',0dh,0ah,0dh,0ah,0
_xmm15 db 'XMM15 = %X',0dh,0ah,0dh,0ah,0
; 256位 YMM 寄存器
_ymm0 db 'YMM0 = %X',0dh,0ah,0dh,0ah,0
_ymm1 db 'YMM1 = %X',0dh,0ah,0dh,0ah,0
_ymm2 db 'YMM2 = %X',0dh,0ah,0dh,0ah,0
_ymm3 db 'YMM3 = %X',0dh,0ah,0dh,0ah,0
_ymm4 db 'YMM4 = %X',0dh,0ah,0dh,0ah,0
_ymm5 db 'YMM5 = %X',0dh,0ah,0dh,0ah,0
_ymm6 db 'YMM6 = %X',0dh,0ah,0dh,0ah,0
_ymm7 db 'YMM7 = %X',0dh,0ah,0dh,0ah,0
; YMM8-YMM15 进入64位模式使用
_ymm8 db 'YMM8 = %X',0dh,0ah,0dh,0ah,0
_ymm9 db 'YMM9 = %X',0dh,0ah,0dh,0ah,0
_ymm10 db 'YMM10 = %X',0dh,0ah,0dh,0ah,0
_ymm11 db 'YMM11 = %X',0dh,0ah,0dh,0ah,0
_ymm12 db 'YMM12 = %X',0dh,0ah,0dh,0ah,0
_ymm13 db 'YMM13 = %X',0dh,0ah,0dh,0ah,0
_ymm14 db 'YMM14 = %X',0dh,0ah,0dh,0ah,0
_ymm15 db 'YMM15 = %X',0dh,0ah,0dh,0ah,0
; 256位 YMM 寄存器
_ymm0_h db 'YMM0 = %X',0dh,0ah,0dh,0ah,0
_ymm1_h db 'YMM1 = %X',0dh,0ah,0dh,0ah,0
_ymm2_h db 'YMM2 = %X',0dh,0ah,0dh,0ah,0
_ymm3_h db 'YMM3 = %X',0dh,0ah,0dh,0ah,0
_ymm4_h db 'YMM4 = %X',0dh,0ah,0dh,0ah,0
_ymm5_h db 'YMM5 = %X',0dh,0ah,0dh,0ah,0
_ymm6_h db 'YMM6 = %X',0dh,0ah,0dh,0ah,0
_ymm7_h db 'YMM7 = %X',0dh,0ah,0dh,0ah,0
; 64位字模式
; YMM8-YMM15 进入64位模式使用
_ymm8_h db 'YMM8 = %X',0dh,0ah,0dh,0ah,0
_ymm9_h db 'YMM9 = %X',0dh,0ah,0dh,0ah,0
_ymm10_h db 'YMM10 = %X',0dh,0ah,0dh,0ah,0
_ymm11_h db 'YMM11 = %X',0dh,0ah,0dh,0ah,0
_ymm12_h db 'YMM12 = %X',0dh,0ah,0dh,0ah,0
_ymm13_h db 'YMM13 = %X',0dh,0ah,0dh,0ah,0
_ymm14_h db 'YMM14 = %X',0dh,0ah,0dh,0ah,0
_ymm15_h db 'YMM15 = %X',0dh,0ah,0dh,0ah,0
; RDX:RAX 128位操作
; INTEL AVX 指令 VEX 附加前缀
; VEX.vvvv
; R8/R8d - R15/R15d 传统/完全32位模式不可用
; XMM0/YMM0 - XMM7/YMM7 传统/完全32位模式可用
; XMM8/YMM8 - XMM15/YMM15 传统/完全32位模式不可用
; INTEL AVX-512 编码
; EVEX
;================================================================================
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 512位 ZMM 寄存器 新寄存器
_zmm0 db 'ZMM0 = %X',0dh,0ah,0dh,0ah,0
_zmm1 db 'ZMM1 = %X',0dh,0ah,0dh,0ah,0
_zmm2 db 'ZMM2 = %X',0dh,0ah,0dh,0ah,0
_zmm3 db 'ZMM3 = %X',0dh,0ah,0dh,0ah,0
_zmm4 db 'ZMM4 = %X',0dh,0ah,0dh,0ah,0
_zmm5 db 'ZMM5 = %X',0dh,0ah,0dh,0ah,0
_zmm6 db 'ZMM6 = %X',0dh,0ah,0dh,0ah,0
_zmm7 db 'ZMM7 = %X',0dh,0ah,0dh,0ah,0
;
_zmm8 db 'ZMM8 = %X',0dh,0ah,0dh,0ah,0
_zmm9 db 'ZMM9 = %X',0dh,0ah,0dh,0ah,0
_zmm10 db 'ZMM10 = %X',0dh,0ah,0dh,0ah,0
_zmm11 db 'ZMM11 = %X',0dh,0ah,0dh,0ah,0
_zmm12 db 'ZMM12 = %X',0dh,0ah,0dh,0ah,0
_zmm13 db 'ZMM13 = %X',0dh,0ah,0dh,0ah,0
_zmm14 db 'ZMM14 = %X',0dh,0ah,0dh,0ah,0
_zmm15 db 'ZMM15 = %X',0dh,0ah,0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_zmm_hi256 db 'ZMM_Hi256 = %X',0dh,0ah,0dh,0ah,0
_zmm0_h db 'ZMM0_H = %X',0dh,0ah,0dh,0ah,0
_zmm1_h db 'ZMM1_H = %X',0dh,0ah,0dh,0ah,0
_zmm2_h db 'ZMM2_H = %X',0dh,0ah,0dh,0ah,0
_zmm3_h db 'ZMM3_H = %X',0dh,0ah,0dh,0ah,0
_zmm4_h db 'ZMM4_H = %X',0dh,0ah,0dh,0ah,0
_zmm5_h db 'ZMM5_H = %X',0dh,0ah,0dh,0ah,0
_zmm6_h db 'ZMM6_H = %X',0dh,0ah,0dh,0ah,0
_zmm7_h db 'ZMM7_H = %X',0dh,0ah,0dh,0ah,0
;
_zmm8_h db 'ZMM8_H = %X',0dh,0ah,0dh,0ah,0
_zmm9_h db 'ZMM9_H = %X',0dh,0ah,0dh,0ah,0
_zmm10_h db 'ZMM10_H = %X',0dh,0ah,0dh,0ah,0
_zmm11_h db 'ZMM11_H = %X',0dh,0ah,0dh,0ah,0
_zmm12_h db 'ZMM12_H = %X',0dh,0ah,0dh,0ah,0
_zmm13_h db 'ZMM13_H = %X',0dh,0ah,0dh,0ah,0
_zmm14_h db 'ZMM14_H = %X',0dh,0ah,0dh,0ah,0
_zmm15_h db 'ZMM15_H = %X',0dh,0ah,0dh,0ah,0
; 64位模式
_hi16_zmm db 'Hi16_ZMM = %X',0dh,0ah,0dh,0ah,0
_zmm16 db 'ZMM16 = %X',0dh,0ah,0dh,0ah,0
_zmm17 db 'ZMM17 = %X',0dh,0ah,0dh,0ah,0
_zmm18 db 'ZMM18 = %X',0dh,0ah,0dh,0ah,0
_zmm19 db 'ZMM19 = %X',0dh,0ah,0dh,0ah,0
_zmm20 db 'ZMM20 = %X',0dh,0ah,0dh,0ah,0
_zmm21 db 'ZMM21 = %X',0dh,0ah,0dh,0ah,0
_zmm22 db 'ZMM22 = %X',0dh,0ah,0dh,0ah,0
_zmm23 db 'ZMM23 = %X',0dh,0ah,0dh,0ah,0
_zmm24 db 'ZMM24 = %X',0dh,0ah,0dh,0ah,0
_zmm25 db 'ZMM25 = %X',0dh,0ah,0dh,0ah,0
_zmm26 db 'ZMM26 = %X',0dh,0ah,0dh,0ah,0
_zmm27 db 'ZMM27 = %X',0dh,0ah,0dh,0ah,0
_zmm28 db 'ZMM28 = %X',0dh,0ah,0dh,0ah,0
_zmm29 db 'ZMM29 = %X',0dh,0ah,0dh,0ah,0
_zmm30 db 'ZMM30 = %X',0dh,0ah,0dh,0ah,0
_zmm31 db 'ZMM31 = %X',0dh,0ah,0dh,0ah,0
; Intel MPX 支持
_bnd0 db 'BND0 = %X',0dh,0ah,0dh,0ah,0
_bnd1 db 'BND1 = %X',0dh,0ah,0dh,0ah,0
_bnd2 db 'BND2 = %X',0dh,0ah,0dh,0ah,0
_bnd3 db 'BND3 = %X',0dh,0ah,0dh,0ah,0
_pt db 'PT = %X',0dh,0ah,0dh,0ah,0
_pkru db 'PKRU = %X',0dh,0ah,0dh,0ah,0
_cet_u db 'CET_U = %X',0dh,0ah,0dh,0ah,0
_cet_s db 'CET_S = %X',0dh,0ah,0dh,0ah,0
_hdc db 'HDC = %X',0dh,0ah,0dh,0ah,0
_hwp db 'HWP = %X',0dh,0ah,0dh,0ah,0
[section .text]
start:
xor rax,rax
xor al,al
al_1:
push rax
lea rax,_al
push rax
call printf
pop rax
pop rax
inc al
jnc al_1
xor rax,rax,
xor ah,ah
ah_1:
push rax
lea rax,_ah
push rax
call printf
pop rax
pop rax
inc ah
jnc ah_1
xor rbx,rbx
xor bl,bl
bl_1:
push rbx
lea rax,_bl
push rax
call printf
pop rax
pop rbx
inc bl
jnc bl_1
xor rbx,rbx
xor bh,bh
bh_1:
push rbx
lea rax,_bh
push rax
call printf
pop rax
pop rbx
inc bh
jnc bh_1
xor rcx,rcx
xor cl,cl
cl_1:
push rcx
lea rax,_cl
push rax
call printf
pop rax
pop rcx
inc cl
jnc cl_1
xor rcx,rcx
xor ch,ch
ch_1:
push rcx
lea rax,_ch
push rax
call printf
pop rax
pop rcx
inc ch
jnc ch_1
xor rdx,rdx
xor dl,dl
dl_1:
push rdx
lea rax,_dl
push rax
call printf
pop rax
pop rdx
inc dl
jnc dl_1
xor rdx,rdx
xor dh,dh
dh_1:
push rbx
lea rax,_dh
push rax
call printf
pop rax
pop rbx
inc dh
jnc dh_1
xor rax,rax
xor ax,ax
ax_1:
push rax
lea rax,_ax
push rax
call printf
pop rax
pop rax
inc ax
jnc ax_1
xor rbx,rbx
xor bx,bx
bx_1:
push rbx
lea rax,_bx
push rax
call printf
pop rax
pop rbx
inc bx
jnc bx_1
xor rcx,rcx
xor bh,bh
cx_1:
push rcx
lea rax,_cx
push rax
call printf
pop rax
pop rcx
inc cx
jnc cx_1
xor rdx,rdx
xor dx,dx
dx_1:
push rdx
lea rax,_dx
push rax
call printf
pop rax
pop rdx
inc dx
jnc dx_1
; 汇编语言不能编译和识别的寄存器
;========================================
; REX.B REG段
;----------------------------------------
; SPL 是 4
; BPL 是 5
; SIL 是 6
; DIL 是 7
; 可以通过机器编码指令表计算出指令值
; ***** 具体计算公式看前面指令概要! *****
;========================================
; xor rbp,rbp
; xor bpl,bpl
; 汇编语言没有这个指令啊!!! CPU 有。
;bpl_1:
; push rbp
; call printf
; inc bpl
; jnc bpl_1
; xor rsp,rsp
; xor spl,spl
;spl_1:
; push rsp
; call printf
; inc spl
; jnc spl_1
; xor rsi,rsi
; xor sil,sil
;sil_1:
; push rsi
; call printf
; inc sil
; jnc sil_1
; xor rdi,rdi
; xor dil,dil
;dil_1:
; push rdi
; call printf
; inc dil
; jnc dil_1
xor rax,rax
xor eax,eax
eax_1:
push rax
lea rax,_eax
; push eax ;32bits
push rax ;64bits
call printf
; pop eax ;32bits
pop rax ;64bits
pop rax
mov eax,0ffffffffh
jnc eax_1
xor rbx,rbx
xor bh,bh
ebx_1:
push rbx
lea rax,_ebx
; push eax ;32bits
push rax ;64bits
call printf
; pop eax ;32bits
pop rax ;64bits
pop rbx
mov ebx,0ffffffffh
jnc ebx_1
xor rcx,rcx
xor ecx,ecx
ecx_1:
push rcx
lea rax,_ecx
; push eax
call printf
pop rax
pop rcx
mov ecx,0ffffffffh
jnc ecx_1
xor rdx,rdx
xor edx,edx
edx_1:
push rdx
lea rax,_edx
push rax
call printf
pop rax
pop rdx
mov edx,0ffffffffh
jnc edx_1
xor rsp,rsp
xor esp,esp
esp_1:
push rsp
lea rax,_esp
push rax
call printf
pop rax
pop rsp
mov esp,0ffffffffh
jnc esp_1
xor rbp,rbp
xor ebp,ebp
ebp_1:
push rbp
lea rax,_ebp
push rax
call printf
pop rax
pop rbp
mov ebp,0ffffffffh
jnc ebp_1
xor rsi,rsi
xor esi,esi
esi_1:
push rsi
lea rax,_esi
push rax
call printf
pop rax
pop rsi
mov esi,0ffffffffh
jnc esi_1
xor rdi,rdi
xor edi,edi
edi_1:
push rdi
lea rax,_edi
push rax
call printf
pop rax
mov edi,0ffffffffh
jnc edi_1
xor rax,rax
rax_1:
push rax
lea rax,_rax
push rax
call printf
pop rax
pop rax
mov rax,0ffffffffffffffffh
jnc rax_1
xor rcx,rcx
rcx_1:
push rcx
lea rax,_rcx
push rax
call printf
pop rax
pop rcx
mov rcx,0ffffffffffffffffh
jnc rcx_1
xor rbx,rbx
rbx_1:
push rbx
lea rax,_rbx
push rax
call printf
pop rax
pop rbx
mov rbx,0ffffffffffffffffh
jnc rbx_1
xor rdx,rdx
rdx_1:
push rdx
lea rax,_rdx
push rax
call printf
pop rax
pop rdx
mov rdx,0ffffffffffffffffh
jnc rdx_1
xor rbp,rbp
rbp_1:
push rbp
lea rax,_rbp
push rax
call printf
pop rax
pop rbp
mov rbp,0ffffffffffffffffh
jnc rbp_1
xor rsp,rsp
rsp_1:
push rsp
lea rax,_rsp
push rax
call printf
pop rax
pop rsp
mov rsp,0ffffffffffffffffh
jnc rsp_1
xor rdi,rdi
rdi_1:
push rdi
lea rax,_rdi
push rax
call printf
pop rax
pop rdi
mov rdi,0ffffffffffffffffh
jnc rdi_1
xor rsi,rsi
rsi_1:
push rsi
lea rax,_rsi
push rax
call printf
pop rax
pop rsi
mov rsi,0ffffffffffffffffh
jnc rsi_1
; 新版本测试IP寄存器
;ip_1:
; push ip
; lea eax,_ip
; push eax
; call printf
; pop eax
; pop ip
; 新版本测试
;eip_1:
; push eip
; call printf
; 新版本测试
;rip_1:
; push rip
; call printf
; 新版本测试
;cs_1:
; push cs
; call printf
; 新版本测试
;ds_1:
; push ds
; call printf
; 新版本测试
;es_1:
; push es
; call printf
; 新版本测试
;fs_1:
; push fs
; call printf
; 新版本测试
;falg_1:
; pushf
; call printf
; 新版本测试
;eflag_1:
; pushf
; call printf
; 新版本测试
;rflag_1:
; pushf
; call printf
; 新版本测试 r0l-r7l
;r0l_1:
; push r0l
; lea rax,_r0l
; push rax
; call printf
; pop rax
; pop r0l
; mov r0l,0ffffffffh
; jnc r0l_1
;r1l_1:
; push r1l
; lea rax,_r1l
; push rax
; call printf
; pop rax
; pop r1l
; mov r1l,0ffffffffh
; jnc r1l_1
;r2l_1:
; push r2l
; lea rax,_r2l
; push rax
; call printf
; pop rax
; pop r2l
; mov r2l,0ffffffffh
; jnc r2l_1
;r3l_1:
; push r3l
; lea rax,_r3l
; push rax
; call printf
; pop rax
; pop r3l
; mov r3l,0ffffffffh
; jnc r3l_1
;r4l_1:
; push r4l
; lea rax,_r4l
; push rax
; call printf
; pop rax
; pop r4l
; mov r4l,0ffffffffh
; jnc r4l_1
;r5l_1:
; push r5l
; lea rax,_r5l
; push rax
; call printf
; pop rax
; pop r5l
; mov r5l,0ffffffffh
; jnc r5l_1
;r6l_1:
; push r6l
; lea rax,_r6l
; push rax
; call printf
; pop rax
; pop r6l
; mov r6l,0ffffffffh
; jnc r6l_1
;r7l_1:
; push r7l
; lea rax,_r7l
; push rax
; call printf
; pop rax
; pop r7l
; mov r7l,0ffffffffh
; jnc r7l_1
; 新版本nasm汇编再用 r0w-r7w
;r0w_1:
; push r0w
; call printf
;r1w_1:
; push r1w
; call printf
;r2w_1:
; push r2w
; call printf
;r3w_1:
; push r3w
; call printf
;r4w_1:
; push r4l
; call printf
;r5w_1:
; push r5l
; call printf
;r6w_1:
; push r6w
; call printf
;r7w_1:
; push r7w
; call printf
; push r7l
; lea rax,_r7l
; push rax
; call printf
; pop rax
; pop r7l
; mov r7l,0ffffffffh
; jnc r7l_1
r8w_1:
push r8w
lea rax,_r8w
push rax
call printf
pop rax
pop r8w
jnc r8w_1
r9w_1:
push r9w
lea rax,_r9w
push rax
call printf
pop rax
pop r9w
jnc r9w_1
r10w_1:
push r10w
lea rax,_r10w
push rax
call printf
pop rax
pop r10w
jnc r10w_1
r11w_1:
push r11w
lea rax,_r11w
push rax
call printf
pop rax
pop r11w
jnc r11w_1
r12w_1:
push r12w
lea rax,_r12w
push rax
call printf
pop rax
pop r12w
jnc r12w_1
r13w_1:
push r13w
lea rax,_r13w
push rax
call printf
pop rax
pop r13w
jnc r13w_1
r14w_1:
push r14w
lea rax,_r14w
push rax
call printf
pop rax
pop r14w
jnc r14w_1
r15w_1:
push r15w
lea rax,_r15w
push rax
call printf
pop rax
pop r15w
jnc r15w_1
; 新版本支持 r0d-r7d nasm汇编语言支持
;r0d_1:
; push r0d
; call printf
;r1d_1:
; push r1d
; call printf
;r2d_1:
; push r2d
; call printf
;r3d_1:
; push r3d
; call printf
;r4d_1:
; push r4d
; call printf
;r5d_1:
; push r5d
; call printf
;r6d_1:
; push r6d
; call printf
;r7d_1:
; push r7d
; call printf
; 新版本支持 r0-r7 nasm汇编语言支持
;r0_1:
; push r0
; call printf
;r1_1:
; push r1
; call printf
;r2_1:
; push r2
; call printf
;r3_1:
; push r3
; call printf
;r4_1:
; push r4
; call printf
;r5_1:
; push r5
; call printf
;r6_1:
; push r6
; call printf
;r7_1:
; push r7
; call printf
; 需要改进的测试方法
;st0_1:
; push st0
; call printf
;st1_1:
; push st1
; call printf
;st2_1:
; push st2
; call printf
;st3_1:
; push st3
; call printf
;st4_1:
; push st4
; call printf
;st5_1:
; push st5
; call printf
;st6_1:
; push st6
; call printf
;st7_1:
; push st7
; call printf
; 新版本支持,略过... mmx0-mmx31 nasm 汇编语言要支持
; 测试方法
;mmx0_1:
; push mmx0
; call printf
;mmx1_1:
; push mmx1
; call printf
;mmx2_1:
; push mmx2
; call printf
;mmx3_1:
; push mmx3
; call printf
;mmx4_1:
; push mmx4
; call printf
;mmx5_1:
; push mmx5
; call printf
;mmx6_1:
; push mmx6
; call printf
;mmx7_1:
; push mmx7
; call printf
;mmx8_1:
; push mmx8
; call printf
;mmx9_1:
; push mmx9
; call printf
;mmx10_1:
; push mmx10
; call printf
;mmx11_1:
; push mmx11
; call printf
;mmx12_1:
; push mmx12
; call printf
;mmx13_1:
; push mmx13
; call printf
;mmx14_1:
; push mmx14
; call printf
;mmx15_1:
; push mmx15
; call printf
xmm0_1:
movups xmm0,[n_128]
push rax
lea rax,_xmm0
push rax
call printf
pop rax
pop rax
xmm1_1:
movups xmm1,[n_128]
push rax
lea rax,_xmm1
push rax
call printf
pop rax
pop rax
xmm2_1:
movups xmm2,[n_128]
push rax
lea rax,_xmm2
push rax
call printf
pop rax
pop rax
xmm3_1:
movups xmm3,[n_128]
push rax
lea rax,_xmm3
push rax
call printf
pop rax
pop rax
xmm4_1:
movups xmm4,[n_128]
push rax
lea rax,_xmm4
push rax
call printf
pop rax
pop rax
xmm5_1:
movups xmm5,[n_128]
push rax
lea rax,_xmm5
push rax
call printf
pop rax
pop rax
xmm6_1:
movups xmm6,[n_128]
push rax
lea rax,_xmm6
push rax
call printf
pop rax
pop rax
xmm7_1:
movups xmm7,[n_128]
push rax
lea rax,_xmm7
push rax
call printf
pop rax
pop rax
xmm8_1:
movups xmm8,[n_128]
push rax
lea rax,_xmm8
push rax
call printf
pop rax
pop rax
xmm9_1:
movups xmm9,[n_128]
push rax
lea rax,_xmm9
push rax
call printf
pop rax
pop rax
xmm10_1:
movups xmm10,[n_128]
push rax
lea rax,_xmm10
push rax
call printf
pop rax
pop rax
xmm11_1:
movups xmm11,[n_128]
push rax
lea rax,_xmm11
push rax
call printf
pop rax
pop rax
xmm12_1:
movups xmm12,[n_128]
push rax
lea rax,_xmm12
push rax
call printf
pop rax
pop rax
xmm13_1:
movups xmm13,[n_128]
push rax
lea rax,_xmm13
push rax
call printf
pop rax
pop rax
xmm14_1:
movups xmm14,[n_128]
push rax
lea rax,_xmm14
push rax
call printf
pop rax
pop rax
xmm15_1:
movups xmm15,[n_128]
push rax
lea rax,_xmm15
push rax
call printf
pop rax
pop rax
ymm0_1:
vmovups ymm0,[n_256]
lea rax,_ymm0
push rax
call printf
pop rax
pop rax
ymm1_1:
vmovups ymm1,[n_256]
lea rax,_ymm1
push rax
call printf
pop rax
pop rax
ymm2_1:
vmovups ymm2,[n_256]
lea rax,_ymm2
push rax
call printf
pop rax
pop rax
ymm3_1:
vmovups ymm3,[n_256]
lea rax,_ymm3
push rax
call printf
pop rax
pop rax
ymm4_1:
vmovups ymm4,[n_256]
lea rax,_ymm4
push rax
call printf
pop rax
pop rax
ymm5_1:
vmovups ymm5,[n_256]
lea rax,_ymm5
push rax
call printf
pop rax
pop rax
ymm6_1:
vmovups ymm6,[n_256]
lea rax,_ymm6
push rax
call printf
pop rax
pop rax
ymm7_1:
vmovups ymm7,[n_256]
lea rax,_ymm7
push rax
call printf
pop rax
pop rax
ymm8_1:
vmovups ymm8,[n_256]
lea rax,_ymm8
push rax
call printf
pop rax
pop rax
ymm9_1:
vmovups ymm9,[n_256]
lea rax,_ymm9
push rax
call printf
pop rax
pop rax
ymm10_1:
vmovups ymm10,[n_256]
lea rax,_ymm10
push rax
call printf
pop rax
pop rax
ymm11_1:
vmovups ymm11,[n_256]
lea rax,_ymm11
push rax
call printf
pop rax
pop rax
ymm12_1:
vmovups ymm12,[n_256]
lea rax,_ymm12
push rax
call printf
pop rax
pop rax
ymm13_1:
vmovups ymm13,[n_256]
lea rax,_ymm13
push rax
call printf
pop rax
pop rax
ymm14_1:
vmovups ymm14,[n_256]
lea rax,_ymm14
push rax
call printf
pop rax
pop rax
ymm15_1:
vmovups ymm15,[n_256]
lea rax,_ymm15
push rax
call printf
pop rax
pop rax
; ++++++++++ 新增 ++++++++++
; 只有 AVX512 才有 改变高速缓存
; 参于操作的有xmm,ymm寄存器
;zmm0_1:
; vgatherdps zmm0{k3},[ymm15*8]
; lea rax,_zmm0
; push rax
; call printf
; pop rax
;zmm1_1:
; vgatherdps zmm1{k3},[ymm15*8]
; lea rax,_zmm1
; push rax
; call printf
; pop rax
;zmm2_1:
; vgatherdps zmm2{k3},[ymm15*8]
; lea rax,_zmm2
; push rax
; call printf
; pop rax
;zmm3_1:
; vgatherdps zmm3{k3},[ymm15*8]
; lea rax,_zmm3
; push rax
; call printf
; pop rax
;zmm4_1:
; vgatherdps zmm4{k3},[ymm15*8]
; lea rax,_zmm4
; push rax
; call printf
; pop rax
;zmm5_1:
; vgatherdps zmm5{k3},[ymm15*8]
; lea rax,_zmm5
; push rax
; call printf
; pop rax
;zmm6_1:
; vgatherdps zmm6{k3},[ymm15*8]
; lea rax,_zmm6
; push rax
; call printf
; pop rax
;zmm7_1:
; vgatherdps zmm7{k3},[ymm15*8]
; lea rax,_zmm7
; push rax
; call printf
; pop rax
;zmm8_1:
; vgatherdps zmm8{k3},[ymm15*8]
; lea rax,_zmm8
; push rax
; call printf
; pop rax
;zmm9_1:
; vgatherdps zmm9{k3},[ymm15*8]
; lea rax,_zmm9
; push rax
; call printf
; pop rax
;zmm10_1:
; vgatherdps zmm10{k3},[ymm15*8]
; lea rax,_zmm10
; push rax
; call printf
; pop rax
;zmm11_1:
; vgatherdps zmm11{k3},[ymm15*8]
; lea rax,_zmm11
; push rax
; call printf
; pop rax
;zmm12_1:
; vgatherdps zmm12{k3},[ymm15*8]
; lea rax,_zmm12
; push rax
; call printf
; pop rax
;zmm13_1:
; vgatherdps zmm13{k3},[ymm15*8]
; lea rax,_zmm13
; push rax
; call printf
; pop rax
;zmm14_1:
; vgatherdps zmm0{k3},[ymm15*8]
; lea rax,_zmm14
; push rax
; call printf
; pop rax
;zmm15_1:
; vgatherdps zmm15{k3},[ymm15*8]
; lea rax,_zmm15
; push rax
; call printf
; pop rax
;hi16_zmm1:
; vgatherdps hi16_zmm{k3},[ymm15*8]
; lea rax,hi16_zmm
; push rax
; call printf
; pop rax
;zmm16_1:
; vgatherdps zmm16{k3},[ymm15*8]
; lea rax,_zmm16
; push rax
; call printf
; pop rax
;zmm17_1:
; vgatherdps zmm17{k3},[ymm15*8]
; lea rax,_zmm17
; push rax
; call printf
; pop rax
;zmm18_1:
; vgatherdps zmm18{k3},[ymm15*8]
; lea rax,_zmm18
; push rax
; call printf
; pop rax
;zmm19_1:
; vgatherdps zmm19{k3},[ymm15*8]
; lea rax,_zmm19
; push rax
; call printf
; pop rax
;zmm20_1:
; vgatherdps zmm20{k3},[ymm15*8]
; lea rax,_zmm20
; push rax
; call printf
; pop rax
;zmm21_1:
; vgatherdps zmm21{k3},[ymm15*8]
; lea rax,_zmm21
; push rax
; call printf
; pop rax
;zmm22_1:
; vgatherdps zmm22{k3},[ymm15*8]
; lea rax,_zmm22
; push rax
; call printf
; pop rax
;zmm23_1:
; vgatherdps zmm23{k3},[ymm15*8]
; lea rax,_zmm23
; push rax
; call printf
; pop rax
;zmm24_1:
; vgatherdps zmm24{k3},[ymm15*8]
; lea rax,_zmm24
; push rax
; call printf
; pop rax
;zmm25_1:
; vgatherdps zmm25{k3},[ymm15*8]
; lea rax,_zmm25
; push rax
; call printf
; pop rax
;zmm26_1:
; vgatherdps zmm26{k3},[ymm15*8]
; lea rax,_zmm26
; push rax
; call printf
; pop rax
;zmm27_1:
; vgatherdps zmm27{k3},[ymm15*8]
; lea rax,_zmm27
; push rax
; call printf
; pop rax
;zmm28_1:
; vgatherdps zmm28{k3},[ymm15*8]
; lea rax,_zmm28
; push rax
; call printf
; pop rax
;zmm29_1:
; vgatherdps zmm29{k3},[ymm15*8]
; lea rax,_zmm29
; push rax
; call printf
; pop rax
;zmm30_1:
; vgatherdps zmm30{k3},[ymm15*8]
; lea rax,_zmm30
; push rax
; call printf
; pop rax
;zmm31_1:
; vgatherdps zmm31{k3},[ymm15*8]
; lea rax,_zmm31
; push rax
; call printf
; pop rax
; ymm0_h-ymm15_h 用于avx 技术系列
; 新版本支持 nasm汇编语言未识别 cpu类别不同
ymm0_h1:
; push ymm0_h
; call printf
ymm1_h1:
ymm2_h1:
ymm3_h1:
ymm4_h1:
ymm5_h1:
ymm6_h1:
ymm7_h1:
ymm8_h1:
ymm9_h1:
ymm10_h1:
ymm11_h1:
ymm12_h1:
ymm13_h1:
ymm14_h1:
ymm15_h1:
; zmm0_h-zmm15_h 用于avx 技术系列
; 新版本支持 nasm汇编语言未识别 cpu类别不同
zmm_hi256:
zmm0_h1:
zmm1_h1:
zmm2_h1:
zmm3_h1:
zmm4_h1:
zmm5_h1:
zmm6_h1:
zmm7_h1:
zmm8_h1:
zmm9_h1:
zmm10_h1:
zmm11_h1:
zmm12_h1:
zmm13_h1:
zmm14_h1:
zmm15_h1:
现在添加一下最新的nasm 汇编语言和最新指令表示的寄存器测试。 汇编源码文件:
regsyster.zip






鄂公网安备42010402000303号